pyspark - Pyspark:如何用数组中的值替换每一行的值
问题描述
我将用 monthList 数组中的值更改日期列中的数字。
月列表数组
monthList = ["None","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
pyspark 代码
d = df.select(col('InvoiceDate'),col('TotalSales')/1000000).groupBy(month('InvoiceDate')).sum()
d = d.select(col('month(InvoiceDate)').alias('date'),col('sum((TotalSales / 1000000))').alias('value')).orderBy('date')
d = d.select(col('date'),round(col('value'),2).alias('value'))
d.show()
结果
+----+-----+
|date|value|
+----+-----+
| 1|19.75|
| 2|15.51|
| 3|20.66|
+----+-----+
我会试试这个,但它不起作用。是错误'DataFrame' object has no attribute 'apply'
d.date = d.select('date').apply(lambda x: monthList[x])
谢谢你的帮助。
解决方案
一种方法是date_lookup
使用monthlist
. 这个df可以broadcasted
用于性能。然后你可以用实际的df执行左连接。
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
spark = SparkSession.builder \
.appName('practice')\
.getOrCreate()
sc= spark.sparkContext
monthList = ["None","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
lookup_list = []
for i in range(len(monthList)):
lookup_list.append((i,monthList[i]))
date_lookup = sc.parallelize(lookup_list).toDF(["date_num", "date_label"])
date_lookup.show()
+--------+----------+
|date_num|date_label|
+--------+----------+
| 0| None|
| 1| Jan|
| 2| Feb|
| 3| Mar|
| 4| Apr|
| 5| May|
| 6| Jun|
| 7| Jul|
| 8| Aug|
| 9| Sep|
| 10| Oct|
| 11| Nov|
| 12| Dec|
+--------+----------+
df= sc.parallelize([
(1,19.75), (2,15.51)]).toDF(["date", "value"])
+----+-----+
|date|value|
+----+-----+
| 1|19.75|
| 2|15.51|
+----+-----+
df1 = df.join(F.broadcast(date_lookup),df.date==date_lookup.date_num, how='left').select('date_label','value')
df1.show()
+----------+-----+
|date_label|value|
+----------+-----+
| Jan|19.75|
| Feb|15.51|
+----------+-----+
推荐阅读
- php - 通过转发器获取自定义帖子类型字段
- android - 错误:未找到 Gradle DSL 方法:'implementation()' 但我有最新的 Android Studio,gradle,
- java - Java 和 GlassFish 部署错误:项目当前已归档部署
- android - React Native Firebase 数据库中的 SyntaxError 异常
- python - 从字符串中删除连续元音
- javascript - 为什么我不能在 render 方法中使用 2 个 JSX 标签?
- javascript - 在一分钟的时间间隔内将函数调用限制为最多 15 次
- powerbi - 如何使用 Power Bi 中的 Power Query 编辑器从选择两列的不同值中创建新列
- android - 当尝试更新我的应用程序时出现错误:失败 INSTALL_FAILED_UPDATE_INCOMPATIBLE
- android - 在开发中使用 minifyEnabled=true 是不行的;]