【问题标题】:How to map values by column names at pyspark如何在 pyspark 中按列名映射值
【发布时间】:2019-12-26 15:39:04
【问题描述】:

我想要什么 - 是将列名映射到键。 例如:

#+-------+----------+
#|key1   |key2      |
#+-------+----------+
#|value1 |value2    |
#|value3 |value4    |
#+-------+----------+

将转化为

#+-------+----------+
#|   keys|values    |
#+-------+----------+
#|key1   |value1    |
#|key1   |value2    |
#|key2   |value3    |
#|key2   |value4    |
#+-------+----------+

在 HiveQL 中,我可以编写类似于

的内容
select distinct key, velue
    from xxx
    lateral view explode(map(
            'key1', key1,
            'key2', key2) tab as key, value

但是如何在 pyspark 上编写它。 我可以使用 createtemptable 但我认为这不是最好的解决方案/

【问题讨论】:

    标签: python dataframe apache-spark pyspark apache-spark-sql


    【解决方案1】:

    使用create_map 函数创建一个 Map 列,然后将其分解。

    create_map 需要分组的列表达式列表 作为键值对。可以在 DataFrame 列上使用 for comprehension 创建这样的列表:

    from itertools import chain
    from pyspark.sql.functions import col, lit, create_map, explode
    
    
    data = [("value1", "value2"), ("value3", "value4")]
    df = spark.createDataFrame(data, ["key1", "key2"])
    
    key_values = create_map(*(chain(*[(lit(name), col(name)) for name in df.columns])))
    
    df.select(explode(key_values)).show()
    
    +----+------+
    | key| value|
    +----+------+
    |key1|value1|
    |key2|value2|
    |key1|value3|
    |key2|value4|
    +----+------+
    

    【讨论】:

      【解决方案2】:

      类似的东西?

      select 'key1' as keys,
             key1 as values
      from xxx
      union all 
      select 'key2' as keys,
             key2 as values
      from xxx
      

      输入spark.sql()

      【讨论】:

        猜你喜欢
        • 2020-10-06
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        相关资源
        最近更新 更多