【问题标题】:How to load field with null value from json as number in Dataframe如何将json中的空值字段加载为Dataframe中的数字
【发布时间】:2017-08-31 16:52:18
【问题描述】:

一个表示为 null 的 Json 字段(年龄如下)在 Dataframe printschema 中以字符串形式出现

输入json文件

{"AGE":null,"NAME":"abc","BATCH":190}
{"AGE":null,"NAME":"abc","BATCH":190}

Spark 代码和输出

val df = spark.read.json("/home/white/tmp/a.json")
df.printSchema()
df.show()

*********************
OUTPUT
*********************
root
 |-- BATCH: long (nullable = true)
 |-- AGE: string (nullable = true)
 |-- NAME: string (nullable = true)

+-----+----+----+
|BATCH|AGE|NAME|
+-----+----+----+
|  190|null| abc|
|  190|null| abc|
+-----+----+----+

我希望年龄很长,目前我正在通过创建一个新的 StructType 来实现这一点,其中年龄字段为 Long 并将 Dataframe 重新创建为 df.sqlContext.createDataFrame( df.rdd, newSchema )。我可以直接使用 spark.read.json api 完成这个吗?

【问题讨论】:

  • 我应该添加如何在 json 中将整数值表示为 null,以便 spark 可以理解特定字段是整数。

标签: apache-spark apache-spark-sql spark-dataframe


【解决方案1】:

我认为最简单的方法如下:

spark.read.json("/home/white/tmp/a.json").withColumn("AGE", 'AGE.cast(LongType))

这会产生以下架构:

root
 |-- AGE: long (nullable = true)
 |-- BATCH: long (nullable = true)
 |-- NAME: string (nullable = true)

Spark 对类型进行了最佳猜测,它会在 JSON 中看到 null 并认为“字符串”是有道理的,因为 String 位于 Scala 对象层次结构的可为空的 AnyRef 一侧,而 @ 987654326@ 位于不可为空的 AnyVal 一侧。您只需转换列,让 Spark 以您认为合适的方式处理您的数据。

顺便说一句,你为什么多年来一直使用Long 而不是Int?这些人必须非常吃得健康。

【讨论】:

    【解决方案2】:

    如果您已经知道有哪些类型,我建议您使用预定义的架构进行阅读。

    import org.apache.spark.sql.types._
    val schema = StructType(List(
        StructField("AGE", IntegerType, nullable = true),
        StructField("BATCH", StringType, nullable = true),
        StructField("NAME", StringType, nullable = true)
    ))
    
    spark.read.schema(schema).json("/home/white/tmp/a.json")
    

    【讨论】:

      【解决方案3】:

      您可以创建一个案例类并将其提供给 read.json 方法以进行填充。这将为您提供数据集(不是数据框)

      case class Person(batch: Long, age: Long, name: String)
      val df = spark.read.json("/home/white/tmp/a.json").as[Person]
      

      参考:http://spark.apache.org/docs/latest/sql-programming-guide.html#creating-datasets

      另一种选择是创建您自己的 InputReader 来使用,而不是使用标准 JSON 阅读器。您已经在做的最后一个选项是添加额外的步骤来转换类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-20
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多