使用一行上的lambda进行pySpark计算时的无意义
我在pyspark中有一个df,表示白天汽车行驶的公里数 字段说明: x[3]在意大利语中是一周中的一天,即: LUN(周一) 三月(星期二) 梅(星期三) 新闻局(星期四) 文(星期五) 工商管理局(SAT) 多姆(太阳)使用一行上的lambda进行pySpark计算时的无意义,pyspark,rdd,Pyspark,Rdd,我在pyspark中有一个df,表示白天汽车行驶的公里数 字段说明: x[3]在意大利语中是一周中的一天,即: LUN(周一) 三月(星期二) 梅(星期三) 新闻局(星期四) 文(星期五) 工商管理局(SAT) 多姆(太阳) X[22]是夜间的公里数 X[23]是白天的公里数 目标是插入3个新列。在伪代码中: km_totali (total km): x[22]+x[23] km_festivo (week-end km): x[22]+x[23] if x[3] in [SAB, DOM
X[22]是夜间的公里数
X[23]是白天的公里数 目标是插入3个新列。在伪代码中:
km_totali (total km): x[22]+x[23]
km_festivo (week-end km): x[22]+x[23] if x[3] in [SAB, DOM] i.e. SAT or SUN; else 0
km_feriale (weekday km): x[22]+x[23] if x[3] in [LUN-VEN]. i.e. MON-FRI; else 0
换句话说,应始终计算km_totali。假日公里数应等于周末的总公里数,否则为0
在一周内,公里数应等于总公里数,否则为0 这个看似简单的任务快把我逼疯了。 这是我的代码:
new_df=df.rdd.map(lambda x: Row(
giorno_della_settimana=x[3],
km_totali=x[22]+x[23],
km_feriale=x[22]+x[23] if x[3] in ["LUN","MAR", "MER", "GIO", "VEN] else 0,
km_festivo=x[22]+x[23] if x[3] in ["SAB","DOM"] else 0
)).toDF()
正如您在下面的输出中所看到的,始终计算km_totali(这是正确的,我进行了检查)。它还正确地计算了一周内的节日和节日(下例中为月和月)。但它总是无法计算周末的节日公里数和假日公里数(在下面的示例中,DOM行中没有)
输出:
Row(giorno_della_settimana=u'DOM', km_feriale=None, km_festivo=None, km_totali=106.5),
Row(giorno_della_settimana=u'MER', km_feriale=8.2, km_festivo=0, km_totali=8.2),
Row(giorno_della_settimana=u'LUN', km_feriale=3.0, km_festivo=0, km_totali=3.0),
请注意,km_totali在“DOM”情况下也是正确计算的。事实上,DOM行的期望输出是:
Row(giorno_della_settimana=u'DOM', km_feriale=0, km_festivo=106.5, km_totali=106.5)
让我完全疯狂的是,如果我将km_Festival条件列表中的天数列表扩展到整个星期(从语义角度看毫无意义),km_Festival字段也会在DOM行中正确计算:
new_df=df.map(lambda x: Row(
giorno_della_settimana=x[3],
km_totali=x[22]+x[23],
km_feriale=x[22]+x[23] if x[3] in ["LUN","MAR", "MER","GIO", "VEN"] else 0,
extended-> km_festivo=x[22]+x[23] if x[3] in ["LUN","MAR", "MER","GIO", "VEN","SAB","DOM"] else 0
)).toDF()
Row(giorno_della_settimana=u'DOM', km_feriale=None, km_festivo=106.5, km_totali=106.5),
DOM行的输出:
new_df=df.map(lambda x: Row(
giorno_della_settimana=x[3],
km_totali=x[22]+x[23],
km_feriale=x[22]+x[23] if x[3] in ["LUN","MAR", "MER","GIO", "VEN"] else 0,
extended-> km_festivo=x[22]+x[23] if x[3] in ["LUN","MAR", "MER","GIO", "VEN","SAB","DOM"] else 0
)).toDF()
Row(giorno_della_settimana=u'DOM', km_feriale=None, km_festivo=106.5, km_totali=106.5),
如您所见,现在只为DOM行(即一周结束日)计算km_节日,因为我在条件列表中包含了周天数。这是没有意义的
我觉得这不是一个编码的问题,但我不知道这可能是由于什么
帮助您能提供示例数据吗 我看不出你的代码有什么问题,除了你在做冗余计算(x[22]+x[23]至少两次)而不是事后计算 你能试试吗
import pyspark.sql.函数作为psf
new_df=df.map(λx:Row(
giorno_della_settimana=x[3],
总公里数=x[22]+x[23]
)).toDF()
new_df2=new_df.select(
"*",
psf.when(新的地理位置([“LUN”、“MAR”、“MER”、“GIO”、“VEN”))时,新的地理位置总公里数。否则(0)。别名(“公里数”),
psf.when(新的地理位置)isin([“SAB”,“DOM”]),新的地理位置km(总里程)。否则(0)。别名(“km”),
)
已解决!
在else子句中,我必须返回0.0而不是0。
否则,我有一个混合类型的列。Somtimes浮点和Somtimes整数
这是正确的代码:
new_df=df.rdd.map(lambda x: Row(
giorno_della_settimana=x[3],
km_totali=x[22]+x[23],
km_feriale=x[22]+x[23] if x[3] in ["LUN","MAR", "MER", "GIO", "VEN] else 0.0,
km_festivo=x[22]+x[23] if x[3] in ["SAB","DOM"] else 0.0
)).toDF()
嗨,你的方式很好用。以下是代码输出的一些示例。第二排,节日庆祝活动;第四排,第三排,第三排,第三排,第三排,第三排,第三排,第三排(第四排,第四排,第四排,第四排,第四排,第三排,第三排,第四排,第三排,第三排,第四排,第四排,第二排,第二排,第四排,第四条,第四条,第116.7,节日节,里程0 0,公里总里程=116.7,公里总数=116.7.7,公里总=116.7,公里总数=116.7.7,公里。公里总里程=116.7,公里总里程=116.7,公里总里程=116.7,公里总里程=116.7,公里。公里总里程=116.7,公里总里程=116.7,公里总里程=116.7,公里总里程=116.7,公里总里程=116.7,公里总里程=116.7,116.7,e=4.8,km_=0.0),行(giorno_della_settimana=u'MER',km_feriale=15.4,km_festio=0,km_totali=15.4,km_feriale=15.4,km_festio=0.0),对于
“SAB”
,您仍然可以得到无?您能否提供原始数据框的示例(仅提供所需的列df.select(…).show()
)并将其添加到您的问题中。我现在意识到,您已经在使用数据帧而不是RDD,您应该切换到RDD进行如此简单的操作,但它仍然无法解释问题。[u'MER',0.0,0.0],[u'MER',19.4,0.0],[u'MER',0.6,0.0],[u'MER',22.1,10.5],[u'MER 24.8,0.0],[u'MER 0,0.0],[u'MER 11.9,0.0],[u'MER 0,0.0],[u'SAB',29.2,1.4000000000000001],[u'SAB',48.9,15.8],[u'SAB',70.0,0.0],[u'SAB',23.7,0.0],[u'SAB',5.7,0.0],[u'SAB',9.2,0.0],[u'SAB',277.9,0.0],[u'SAB',5.6,5.7,0.6],[u'SAB',4.8,6.0],[u'SAB',4.8,0.0],[u'SAB',2.0]这是一个示例。疯狂的是,对于MER行,它工作得很好。对于SAB行,它不工作!我很高兴您找到了解决方案!数据类型在pyspark中处理得更好,不使用UDF还有另一个优点,即工作速度更快:)