Mak*_*tin 1 python dataframe apache-spark apache-spark-sql pyspark
我想要什么 - 是将列名映射到键中。例如:
#+-------+----------+
#|key1 |key2 |
#+-------+----------+
#|value1 |value2 |
#|value3 |value4 |
#+-------+----------+
Run Code Online (Sandbox Code Playgroud)
将转变为
#+-------+----------+
#| keys|values |
#+-------+----------+
#|key1 |value1 |
#|key1 |value2 |
#|key2 |value3 |
#|key2 |value4 |
#+-------+----------+
Run Code Online (Sandbox Code Playgroud)
在 HiveQL 中我可以写类似的东西
select distinct key, velue
from xxx
lateral view explode(map(
'key1', key1,
'key2', key2) tab as key, value
Run Code Online (Sandbox Code Playgroud)
但是在pyspark上怎么写呢?我可以使用 createtemptable 但我认为这不是最好的解决方案/
使用create_map函数创建一个Map列,然后将其分解。
create_map需要一个分组为键值对的列表达式列表。可以使用 DataFrame 列的理解来创建这样的列表:
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|
+----+------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2436 次 |
| 最近记录: |