如果json文件中缺少键,我如何获取Dataframe的值?

bkhjykvo  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(273)

我从一个文件夹中加载json文件列表,每个文件都以一个数字结尾,因此我使用通配符一次加载所有文件。

raw_assignments_2 = spark.read.option("multiline","true").option(schema=schema).json("Assignments_*.json")

我在一些文件中缺少一个键/值,spark在将数据读入df时忽略了这些文件。
例如,
我的文件1包含以下键及其值

[{ "id": 8731,
  "resource_type":"assignment",
  "assignee_id":2478
  "status":"complete"}]

我的文件2只包含三个键

[{ "id": 8731,
  "resource_type":"assignment",
  "assignee_id":2478}]

id、resource\u type、assignee\u id是每个json文件中的必填字段,其中status不是必填字段。当json文件中没有键时,如何将状态提取到dataframe中并分配空值

gab6jxml

gab6jxml1#

在模式定义中,可以设置参数 nullable=True 然后将加载json并将缺少的字段设置为null。如果您想要一个专用的状态标志,您可以在以后进行筛选 null 强制列上的。

customschema=StructType([
    StructField("id",DoubleType(), nullable=True),
    StructField("resource_type",StringType(), True),
    StructField("assignee_id",DoubleType(), True),
    StructField("status",StringType(), True)
])

raw_assignments_2 = spark.read.option("multiline","true").schema(customschema).json("data*.json")
raw_assignments_2.show()

raw_assignments_2.withColumn("Issue",f.when(f.col("status").isNull(),True).otherwise(False)).show()

+------+-------------+-----------+--------+
|    id|resource_type|assignee_id|  status|
+------+-------------+-----------+--------+
|8731.0|   assignment|     2478.0|complete|
|8731.0|   assignment|     2478.0|    null|
+------+-------------+-----------+--------+

+------+-------------+-----------+--------+-----+
|    id|resource_type|assignee_id|  status|Issue|
+------+-------------+-----------+--------+-----+
|8731.0|   assignment|     2478.0|complete|false|
|8731.0|   assignment|     2478.0|    null| true|
+------+-------------+-----------+--------+-----+

缺点:它还将标记json中存在但具有 null

相关问题