取一个spark dataframe并将所有行收集到一行中

im9ewurl  于 2023-05-18  发布在  Apache
关注(0)|答案(2)|浏览(212)

有没有一种方法可以像下面的数据那样获取关系spark dataframe:

df = spark.createDataFrame(
    [
        (1, "foo"),  
        (2, "bar"),
    ],
    ["id", "label"]  
)

df.show()

并将所有值(我不关心列名)收集到一个列中,如下所示

new_df = spark.createDataFrame(["1 foo 2 bar"], "string").toDF("new_column")
new_df.show()

我确实需要保持顺序,所以它必须是一个字符串'1 foo 2 bar',而不是'1 2 foo bar'。
有办法做到这一点吗?谢谢

0lvr5msh

0lvr5msh1#

试试这个:

df2=spark.sql("select id,label,lead(id)over(order by id) as id_1,lead(label)over(order by id) as label_2 from df  ")
df2.createOrReplaceTempView("df2")
df3=spark.sql("select concat(CONCAT(id, ' ',  label)  ,  ' ',concat(id_1 ,' ', label_2)) as one_col from df2 where id_1 is not null")
df3.show()

+-----------+
|    one_col|
+-----------+
|1 foo 2 bar|
+-----------+
wecizke3

wecizke32#

是,尝试使用**concat_ws()collect_list() + array_join()**函数。

Example:

from pyspark.sql.functions import *
df = spark.createDataFrame([(1, "foo"),(2, "bar"),],["id", "label"])

df.withColumn("temp", concat_ws(" ", *df.columns)).groupBy(lit(1)).agg(array_join(collect_list(col("temp"))," ").alias("new_column")).\
  drop("1").\
  show(10,False)
#+-----------+
#|new_column |
#+-----------+
#|1 foo 2 bar|
#+-----------+

相关问题