开发者社区> 问答> 正文

Spark SQL - createDataFrame错误的struct schema

社区小助手 2018-12-12 11:33:12 768

尝试使用Spark SQL创建DataFrame时,通过传递一个行列表,如下所示:

some_data = [{'some-column': [{'timestamp': 1353534535353, 'strVal': 'some-string'}]},

         {'some-column': [{'timestamp': 1353534535354, 'strVal': 'another-string'}]}]

spark.createDataFrame([Row(**d) for d in some_data]).printSchema()
生成的DataFrame架构是:

root
|-- some-column: array (nullable = true)
| |-- element: map (containsNull = true)
| | |-- key: string
| | |-- value: long (valueContainsNull = true)
这个模式是错误的,因为strVal列是string类型的(实际上收集此DataFrame将导致nulls此列)。

我期望模式是Array合适的Structs- 通过对值的类型的一些Python反射推断。为什么不是这样?除了在这种情况下明确提供架构之外,我还能做些什么吗?

SQL 分布式计算 Spark Python
分享到
取消 提交回答
全部回答(1)
  • 社区小助手
    2019-07-17 23:20:04

    要使用结构,您应该使用嵌套Rows(namedtuples通常是首选,但需要有效的名称标识符):

    from pyspark.sql import Row

    Outer = Row("some-column")
    Inner = Row("timestamp", "strVal")

    spark.createDataFrame([

    Outer([Inner(1353534535353, 'some-string')]),
    Outer([Inner(1353534535354, 'another-string')])

    ]).printSchema()
    root
    |-- some-column: array (nullable = true)
    | |-- element: struct (containsNull = true)
    | | |-- timestamp: long (nullable = true)
    | | |-- strVal: string (nullable = true)
    根据您目前的结构,可以使用中间JSON实现方案结果:

    import json

    spark.read.json(sc.parallelize(some_data).map(json.dumps)).printSchema()
    root
    |-- some-column: array (nullable = true)
    | |-- element: struct (containsNull = true)
    | | |-- strVal: string (nullable = true)
    | | |-- timestamp: long (nullable = true)
    或显式模式:

    from pyspark.sql.types import *

    schema = StructType([StructField(

    "some-column", ArrayType(StructType([
        StructField("timestamp", LongType()), 
        StructField("strVal", StringType())])

    ))])

    spark.createDataFrame(some_data, schema)
    虽然最后一种方法可能不完美。

    0 0
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

推荐文章
相似问题
推荐课程