【问题标题】:Reading data from csv returns null values从 csv 读取数据返回空值
【发布时间】:2020-01-13 10:49:22
【问题描述】:

我正在尝试使用 Scala 和 Spark 从 csv 读取数据,但是 列的值为空。

我尝试从 csv 读取数据。我还提供了一个架构 方便查询数据。

private val myData= sparkSession.read.schema(createDataSchema).csv("data/myData.csv")
def createDataSchema = {
    val schema = StructType(
      Array(
        StructField("data_index",StringType, nullable = false),
        StructField("property_a",IntegerType, nullable = false),
        StructField("property_b",IntegerType, nullable = false),
        //some other columns
     )
   )

   schema

查询数据:

val myProperty= accidentData.select($"property_b")
myProperty.collect()

我希望数据作为某些值的列表返回

但它们作为包含空值的列表返回(值为空)。 为什么?

当我打印架构时,可为空设置为 true 而不是 false。

我正在使用 Scala 2.12.9 和 Spark 2.4.3。

【问题讨论】:

  • csv 包含什么?
  • 您的数据框是myData,正在查询accidentData
  • 它应该是 myData 因为我想匿名化变量名。所以应该是 val my property = myData.select($"property_b") 。原始 csv 包含来自kaggle 的英国事故数据
  • 您可以添加您的 csv 的屏幕截图吗?
  • csv 文件很大,大约有 33 列和超过 500,000 行。

标签: scala csv apache-spark


【解决方案1】:

在从 CSV 文件加载数据时,尽管 schema 已提供为 nullable = false,Still Spark 将 schema 覆盖为 nullable = true,以便在数据加载期间可以避免空指针。

举个例子,假设 CSV 文件有两行,第二行的列值为空或空。

CSV:
a,1,2
b,,2

如果 nullable = false,当在数据帧上调用操作时,加载数据时会抛出空指针异常,因为要加载空/空值并且没有默认值会抛出空指针。所以为了避免它,Spark 将其覆盖为 nullable = true。

但是,这可以通过将所有 null 替换为默认值然后重新应用架构来解决。

val df = spark.read.schema(schema).csv("data/myData.csv")
val dfWithDefault = df.withColumn("property_a", when(col("property_a").isNull, 0).otherwise(df.col("property_a")))
val dfNullableFalse = spark.sqlContext.createDataFrame(dfWithDefault.rdd, schema)
dfNullableFalse.show(10)

df.printSchema()
root
|-- data_index: string (nullable = true)
|-- property_a: integer (nullable = true)
|-- property_b: integer (nullable = true)

dfNullableFalse.printSchema()
root
|-- data_index: string (nullable = false)
|-- property_a: integer (nullable = false)
|-- property_b: integer (nullable = false)

【讨论】:

  • 当我运行它时,我收到一个执行异常:SparkException:作业因阶段失败而中止:阶段 2.0 中的任务 0 失败 1 次,最近一次失败:阶段 2.0 中丢失任务 0.0
  • 什么是spark版本?您是在本地运行还是在集群上运行?如果在集群上,每个执行程序的内存和执行程序的数量是多少?输入 CSV 大小?
  • 我有 Spark 版本 2.4.3,我在我的计算机上本地运行它。 CSV 文件的大小为 156 MB。我也在使用 Scala 2.12.9
  • 我根据空问题尝试了其他一些csv文件。可以毫无问题地读取较小的文件。只有大文件中的数据为空。我测试了一个 1 列 500 000 行的文件和另一个 3 列 10 行的文件。
  • 我找到了解决方案:要读取大型 csv 文件,我必须设置一些选项:sparkSession.read .option("header","true") .option("inferSchema","true") .csv("myCsvFile.csv") 我找到了解决方案 here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 2016-11-16
  • 2011-09-21
  • 2017-10-05
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多