首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用spark-csv将表示为字符串的CSV读取到Apache Spark中吗

我可以使用spark-csv将表示为字符串的CSV读取到Apache Spark中吗
EN

Stack Overflow用户
提问于 2016-08-24 06:53:15
回答 3查看 11.7K关注 0票数 7

我知道如何使用spark-csv (https://github.com/databricks/spark-csv)将csv文件读取到spark中,但我已经将csv文件表示为字符串,并希望将此字符串直接转换为数据帧。这个是可能的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-23 13:52:57

更新:从Spark2.2.x开始,终于有了一种使用Dataset的正确方法。

代码语言:javascript
复制
import org.apache.spark.sql.{Dataset, SparkSession}
val spark = SparkSession.builder().appName("CsvExample").master("local").getOrCreate()

import spark.implicits._
val csvData: Dataset[String] = spark.sparkContext.parallelize(
  """
    |id, date, timedump
    |1, "2014/01/01 23:00:01",1499959917383
    |2, "2014/11/31 12:40:32",1198138008843
  """.stripMargin.lines.toList).toDS()

val frame = spark.read.option("header", true).option("inferSchema",true).csv(csvData)
frame.show()
frame.printSchema()

旧spark版本

实际上你可以,尽管它使用的是库的内部结构,并且没有被广泛宣传。只需创建并使用您自己的CsvParser实例。下面的示例适用于spark 1.6.0和spark-csv_2.10-1.4.0

代码语言:javascript
复制
    import com.databricks.spark.csv.CsvParser

val csvData = """
|userid,organizationid,userfirstname,usermiddlename,userlastname,usertitle
|1,1,user1,m1,l1,mr
|2,2,user2,m2,l2,mr
|3,3,user3,m3,l3,mr
|""".stripMargin
val rdd = sc.parallelize(csvData.lines.toList)
val csvParser = new CsvParser()
  .withUseHeader(true)
  .withInferSchema(true)


val csvDataFrame: DataFrame = csvParser.csvRdd(sqlContext, rdd)
票数 16
EN

Stack Overflow用户

发布于 2016-08-24 18:00:05

您可以使用例如scala-csv将字符串解析为csv

val myCSVdata : Array[List[String]] = myCSVString.split('\n').flatMap(CSVParser.parseLine(_))

在这里,你可以做更多的处理,数据清理,验证每一行都能很好地解析,并具有相同数量的字段,等等。

然后,您可以将其设置为记录的RDD

val myCSVRDD : RDD[List[String]] = sparkContext.parallelize(msCSVdata)

在这里,您可以将字符串列表转换为case类,以便更好地反映csv数据的字段。您应该从本例中创建的Person中获得一些灵感:

https://spark.apache.org/docs/latest/sql-programming-guide.html#inferring-the-schema-using-reflection

我省略了这一步。

然后,您可以转换为DataFrame:

import spark.implicits._ myCSVDataframe = myCSVRDD.toDF()

票数 4
EN

Stack Overflow用户

发布于 2017-12-14 00:52:36

公认的答案在Spark2.2.0中对我不起作用,但可以引导我使用csvData.lines.toList实现所需的功能

代码语言:javascript
复制
val fileUrl = getClass.getResource(s"/file_in_resources.csv")
val stream = fileUrl.getContent.asInstanceOf[InputStream]
val streamString = Source.fromInputStream(stream).mkString

val csvList = streamString.lines.toList

spark.read
  .option("header", "true")
  .option("inferSchema", "true")
  .csv(csvList.toDS())
  .as[SomeCaseClass]  
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39111918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档