【问题标题】:Flatten Spark Dataframe column of map/dictionary into multiple columns将地图/字典的 Spark Dataframe 列展平为多列
【发布时间】:2018-12-08 21:50:54
【问题描述】:

我们有一个DataFrame,看起来像这样:

DataFrame[event: string, properties: map<string,string>]

请注意,有两列:eventproperties。我们如何根据map 中的键值将properties 列拆分或展平为多个列?


我注意到我可以这样做:

newDf = df.withColumn("foo", col("properties")["foo"])

产生一个Dataframe

DataFrame[event: string, properties: map<string,string>, foo: String]

但是我必须为所有的键一个一个地做这些。有没有办法自动完成所有这些?例如,如果properties中有foobarbaz作为键,我们可以将map展平吗:

DataFrame[event: string, foo: String, bar: String, baz: String]

【问题讨论】:

    标签: python pyspark


    【解决方案1】:

    您可以使用 explode() 函数 - 它通过为每个条目创建两个额外的列来展平地图 - keyvalue

    >>> df.printSchema()
    root
     |-- event: string (nullable = true)
     |-- properties: map (nullable = true)
     |    |-- key: string
     |    |-- value: string (valueContainsNull = true)
    
    >>> df.select('event', explode('properties')).printSchema()
    root
     |-- event: string (nullable = true)
     |-- key: string (nullable = false)
     |-- value: string (nullable = true)
    

    如果您有一个可以分组的具有唯一值的列,则可以使用数据透视。例如:

    df.withColumn('id', monotonically_increasing_id()) \
        .select('id', 'event', explode('properties')) \
        .groupBy('id', 'event').pivot('key').agg(first('value'))
    

    【讨论】:

    • 这很有趣。但我希望它可以根据可用键扩展到 N 列。你知道是否有办法实现这一目标?
    • 您可以使用pivot,如果您有一个可以分组的唯一值列。例如:df.withColumn('id', monotonically_increasing_id()).select('id', 'event', explode('properties')).groupBy('id', 'event').pivot('key').agg(first('value'))
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多