Pyspark Schema for Json文件

时间:2017-06-16 09:20:27

标签: json apache-spark pyspark apache-spark-sql

我正在尝试将复杂的json文件读入spark数据帧。 Spark识别模式,但将字段错误地视为字符串,恰好是一个空数组。 (当它必须是数组类型时,不确定为什么它是String类型) 以下是我期待的样本

arrayfield:[{"name":"somename"},{"address" : "someadress"}]

目前数据如下

arrayfield:[]

这对我的代码的作用是,当我尝试查询arrayfield.name时它会失败。我知道我可以在读取文件时输入模式,但由于json结构非常复杂,所以从头开始编写它并不会真正解决问题。我尝试使用df.schema(在StructType中显示)获取模式并根据我的要求修改它,但是如何将字符串传递回StructType?这可能真的很傻但我发现很难解决这个问题。是否有任何工具/实用程序可以帮助我生成strutType

1 个答案:

答案 0 :(得分:1)

您需要将StructType对象传递给DF构造函数。

让我们说你的DF在执行

后出错了
df.schema

打印输出如下:

StructType(List(StructField(data1,StringType,true),StructField(data2,StringType,true)))

所以,您需要将此字符串翻译成可执行脚本。

  1. 为类型添加导入

    from pyspark.sql.types import *
    
  2. 将列表和括号更改为python的括号

    List() -> []
    
  3. 在每个类型声明后添加括号

    StringType -> StringType()
    
  4. 修复布尔值字符串

    true -> True
    
  5. 将其分配给变量

    schema = StructType([
            StructField("data1", StringType(),True),
            StructField("data2", StringType(),True)])
    
  6. 创建新的DF对象

    spark.read.csv(path, schema=schema)
    
  7. 你已经完成了。