【问题标题】:Spark SQL: automatic schema from csvSpark SQL:来自 csv 的自动模式
【发布时间】:2015-01-14 04:24:30
【问题描述】:

spark sql 是否提供任何方法来自动加载 csv 数据? 我找到了以下 Jira:https://issues.apache.org/jira/browse/SPARK-2360 但它已关闭....

目前我会按如下方式加载 csv 文件:

case class Record(id: String, val1: String, val2: String, ....)

 sc.textFile("Data.csv")
.map(_.split(",")) 
.map { r =>                  
   Record(r(0),r(1), .....)
}.registerAsTable("table1")

关于从 csv 文件中自动推断模式的任何提示?特别是 a) 我如何生成一个表示模式的类和 b) 我如何自动填充它(即 Record(r(0),r(1), .....))?

更新: 我在这里找到了模式生成的部分答案: http://spark.apache.org/docs/1.1.0/sql-programming-guide.html#data-sources

// The schema is encoded in a string
val schemaString = "name age"
// Generate the schema based on the string of schema
val schema =
 StructType(
schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))
// Convert records of the RDD (people) to Rows.
val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))
// Apply the schema to the RDD.
val peopleSchemaRDD = sqlContext.applySchema(rowRDD, schema)

所以剩下的唯一问题就是如何执行该步骤 map(p => Row(p(0), p(1).trim)) 动态为给定数量的属性?

感谢您的支持! 约尔格

【问题讨论】:

    标签: scala csv apache-spark apache-spark-sql


    【解决方案1】:
    val schemaString = "name age".split(" ")
    // Generate the schema based on the string of schema
    val schema =   StructType(schemaString.map(fieldName => StructField(fieldName, StringType, true)))
    val lines = people.flatMap(x=> x.split("\n"))
    val rowRDD = lines.map(line=>{
      Row.fromSeq(line.split(" "))
    })
    val peopleSchemaRDD = sqlContext.applySchema(rowRDD, schema)
    

    也许这个链接会对你有所帮助。

    http://devslogics.blogspot.in/2014/11/spark-sql-automatic-schema-from-csv.html

    【讨论】:

      【解决方案2】:

      您可以使用spark-csv 来节省一些击键,而不必定义列名并自动使用标题。

      【讨论】:

      • 我认为最初的问题是关于使用 case class 而不是 DataFrame
      • @user955091 您的投票理由没有考虑到:1)问题更多是关于找到解决 spark sql 和 csv 的解决方案,而不是关于案例类,2)答案已被接受由问题的作者提出,3)在您投反对票之前,答案已经累积了 4 个赞成票。所以你不觉得你的投票有点苛刻吗?
      猜你喜欢
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 2018-09-02
      • 2019-11-19
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多