如何更改 RDD/Spark Dataframe 的结构?

发布于 2025-01-12 22:22:21 字数 749 浏览 0 评论 0原文

从这种 rdd/spark 数据框:

日期TokyoNew York
01/0112
02/0132
03/0145

到下面这种形式的相同数据的最简单的过程是什么?

城市日期
东京01/011
纽约01/012
东京02/013
纽约02/012
东京03/014
纽约03/015

What is the easiest procedure to go from this kind of rdd/spark dataframe:

dateTokyoNew York
01/0112
02/0132
03/0145

to the same data in this form below?

citydatevalue
Tokyo01/011
New York01/012
Tokyo02/013
New York02/012
Tokyo03/014
New York03/015

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

海拔太高太耀眼 2025-01-19 22:22:21

我将使用 create_mapexplode 等函数通过 pyspark sql 解决这个问题

,如下 -

from pyspark.sql import functions as func

df1= df.withColumn('mapCol',
                    func.create_map(func.lit('Tokyo'),df.Tokyo,
                                    func.lit('New York'),df["New York"]
                                   ) 
                  )

res = df1.select('*',func.explode(df1.mapCol).alias('city','value')).drop("Tokyo", "New York", "mapCol")
res.show()

输出:

+-----+--------+-----+
| date|    city|value|
+-----+--------+-----+
|01/01|   Tokyo|    1|
|01/01|New York|    2|
|02/01|   Tokyo|    3|
|02/01|New York|    2|
|03/01|   Tokyo|    4|
|03/01|New York|    5|
+-----+--------+-----+

I would solve this with pyspark sql using functions like create_map and explode

As below -

from pyspark.sql import functions as func

df1= df.withColumn('mapCol',
                    func.create_map(func.lit('Tokyo'),df.Tokyo,
                                    func.lit('New York'),df["New York"]
                                   ) 
                  )

res = df1.select('*',func.explode(df1.mapCol).alias('city','value')).drop("Tokyo", "New York", "mapCol")
res.show()

Output :

+-----+--------+-----+
| date|    city|value|
+-----+--------+-----+
|01/01|   Tokyo|    1|
|01/01|New York|    2|
|02/01|   Tokyo|    3|
|02/01|New York|    2|
|03/01|   Tokyo|    4|
|03/01|New York|    5|
+-----+--------+-----+
那伤。 2025-01-19 22:22:21

有一个更简单的解决方案,使用 stack

< code>apache-spark-sql

with t (date, Tokyo, `New York`) as (select stack(3 ,'01/01',1,2 ,'02/01',3,2 ,'03/01',4,5))

-- The solution starts here

select date, stack(2, 'Tokyo',Tokyo,'New York',`New York`) as (city,value)
from   t
日期城市
01/01东京1
01/01纽约2
02/01东京3
02/01纽约2
03/01东京4
03/01纽约5

pyspark

df = spark.sql("select stack(3 ,'01/01',1,2 ,'02/01',3,2 ,'03/01',4,5) as (date, Tokyo, `New York`)")

#The solution starts here
df.selectExpr("date", "stack(2, 'Tokyo',Tokyo,'New York',`New York`) as (city,value)").show()

+-----+--------+-----+
| date|    city|value|
+-----+--------+-----+
|01/01|   Tokyo|    1|
|01/01|New York|    2|
|02/01|   Tokyo|    3|
|02/01|New York|    2|
|03/01|   Tokyo|    4|
|03/01|New York|    5|
+-----+--------+-----+

There is a much simpler solution, using stack

apache-spark-sql

with t (date, Tokyo, `New York`) as (select stack(3 ,'01/01',1,2 ,'02/01',3,2 ,'03/01',4,5))

-- The solution starts here

select date, stack(2, 'Tokyo',Tokyo,'New York',`New York`) as (city,value)
from   t
datecityvalue
01/01Tokyo1
01/01New York2
02/01Tokyo3
02/01New York2
03/01Tokyo4
03/01New York5

pyspark

df = spark.sql("select stack(3 ,'01/01',1,2 ,'02/01',3,2 ,'03/01',4,5) as (date, Tokyo, `New York`)")

#The solution starts here
df.selectExpr("date", "stack(2, 'Tokyo',Tokyo,'New York',`New York`) as (city,value)").show()

+-----+--------+-----+
| date|    city|value|
+-----+--------+-----+
|01/01|   Tokyo|    1|
|01/01|New York|    2|
|02/01|   Tokyo|    3|
|02/01|New York|    2|
|03/01|   Tokyo|    4|
|03/01|New York|    5|
+-----+--------+-----+
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文