【问题标题】:Pyspark - Issue creating a dataframe from RDD using a defined schemaPyspark - 使用定义的模式从 RDD 创建数据帧的问题
【发布时间】:2018-01-20 13:07:33
【问题描述】:

我正在尝试使用 createDataFrame 函数和定义的 schema 将 RDD 转换为数据帧,并将生成的数据帧存储为 json:

df_final = sqlContext.createDataFrame(my_rdd, schema)
df_final.write.json('/tmp/data')

RDD 包含以下行:

{"obj1": {"name": "ABC", "dateCreatedUtc": "2017-06-23 00:00:00", "pair1": {"lat": 60.82349395751953, "lon": -8.173828125}, "pair2": {"lat": 49.16015625, "lon": 1.867676019668579}}, "obj2": {"name": "DEF", "pair1": {"lat": "0.00", "lon": "0.00"},  "pair2": {"lat": "0.00", "lon": "0.00"}}}
{"obj1": {"name": "GHI", "dateCreatedUtc": "2017-06-23 00:00:00", "pair1": {"lat": 10.43567890021344, "lon": -17.34675465}, "pair2": {"lat": 80.36473824, "lon": 4.557957859758945}}, "obj2": {"name": "JKL", "pair1": {"lat": "0.00", "lon": "0.00"},  "pair2": {"lat": "0.00", "lon": "0.00"}}}
...
...
...

我尝试如下定义schema

schema = StructType([
    StructField('obj1', MapType(StringType(), MapType(StringType(), StringType(), True), True), True),
    StructField('obj2', MapType(StringType(), MapType(StringType(), StringType(), True), True), True)
])

代码运行良好,但是当我检查我的输出 json 文件时,行如下所示:

{"obj1": {"name": null, "dateCreatedUtc": null, "pair1": {"lat": 60.82349395751953, "lon": -8.173828125}, "pair2": {"lat": 49.16015625, "lon": 1.867676019668579}}, "obj2": {"name": null, "pair1": {"lat": "0.00", "lon": "0.00"},  "pair2": {"lat": "0.00", "lon": "0.00"}}}
{"obj1": {"name": null, "dateCreatedUtc": null, "pair1": {"lat": 10.43567890021344, "lon": -17.34675465}, "pair2": {"lat": 80.36473824, "lon": 4.557957859758945}}, "obj2": {"name": null, "pair1": {"lat": "0.00", "lon": "0.00"},  "pair2": {"lat": "0.00", "lon": "0.00"}}}

TL;DR - 除 lat 和 lon 之外的所有字段都已填充空值。

我可以看到这意味着 RDD 行和我定义的模式之间的模式不匹配。但是,我无法弄清楚架构的问题,因为我已经满足/认为我已经满足了嵌套的 json 结构。

不胜感激任何有关此的帮助/指针。

谢谢!

【问题讨论】:

    标签: json pyspark schema spark-dataframe


    【解决方案1】:

    MapType 不是表示混合类型数据的方法。示例记录的正确模式(我假设这些是 Python dicts)将是:

    StructType([
        StructField("obj1", StructType([
            StructField("dateCreatedUtc", StringType(), True), 
            StructField("name", StringType(), True), 
            StructField("pair1", StructType([
                StructField("lat", DoubleType(), True), 
                StructField("lon", DoubleType(), True)
            ]), True), 
            StructField("pair2", StructType([
                StructField("lat", DoubleType(), True), 
                StructField("lon", DoubleType(), True)
            ]),  True)
        ]), True), 
        StructField("obj2", StructType([
            StructField("name", StringType(), True), 
            StructField("pair1", StructType([
                StructField("lat", StringType(), True), 
                StructField("lon", StringType(), True)
            ]), True), 
            StructField("pair2", StructType([
                StructField("lat", StringType(), True), 
                StructField("lon", StringType(), True)
            ]), True)
        ]), True)
    ])
    

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      相关资源
      最近更新 更多