【问题标题】:Create Spark Dataset from a CSV file从 CSV 文件创建 Spark 数据集
【发布时间】:2017-01-24 03:31:44
【问题描述】:

我想从一个简单的 CSV 文件创建一个 Spark 数据集。以下是 CSV 文件的内容:

name,state,number_of_people,coolness_index
trenton,nj,"10","4.5"
bedford,ny,"20","3.3"
patterson,nj,"30","2.2"
camden,nj,"40","8.8"

这是制作数据集的代码:

var location = "s3a://path_to_csv"

case class City(name: String, state: String, number_of_people: Long)

val cities = spark.read
  .option("header", "true")
  .option("charset", "UTF8")
  .option("delimiter",",")
  .csv(location)
  .as[City]

这是错误消息:“无法将 number_of_people 从字符串转换为 bigint,因为它可能会被截断”

Databricks 在 this blog post 中讨论了创建数据集和此特定错误消息。

编码器急切地检查您的数据是否与预期的架构匹配, 在您尝试错误之前提供有用的错误消息 处理 TB 的数据。例如,如果我们尝试使用的数据类型是 太小,以至于转换为对象会导致 截断(即 numStudents 大于一个字节,其中包含一个 最大值 255) 分析器将发出 AnalysisException。

我使用的是Long类型,所以没想到会看到这个错误信息。

【问题讨论】:

    标签: apache-spark apache-spark-dataset


    【解决方案1】:

    您的案例类为 case class City(name: String, state: String, number_of_people: Long), 你只需要一行

    private val cityEncoder = Seq(City("", "", 0)).toDS
    

    然后你编码

    val cities = spark.read
    .option("header", "true")
    .option("charset", "UTF8")
    .option("delimiter",",")
    .csv(location)
    .as[City]
    

    会起作用的。

    这是官方来源 [http://spark.apache.org/docs/latest/sql-programming-guide.html#overview][1]

    【讨论】:

    • 能否请您详细说明在创建数据框和数据集的代码中如何使用此 cityEncoder ?
    • 您的意思是在转换为数据集之前使用编码器指定数据帧的架构吗?
    【解决方案2】:

    使用架构推断:

    val cities = spark.read
      .option("inferSchema", "true")
      ...
    

    或提供架构:

    val cities = spark.read
      .schema(StructType(Array(StructField("name", StringType), ...)
    

    或演员:

    val cities = spark.read
      .option("header", "true")
      .csv(location)
      .withColumn("number_of_people", col("number_of_people").cast(LongType))
      .as[City]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2015-01-30
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2011-02-06
      相关资源
      最近更新 更多