Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用一行上的lambda进行pySpark计算时的无意义_Pyspark_Rdd - Fatal编程技术网

使用一行上的lambda进行pySpark计算时的无意义

使用一行上的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

我在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] 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还有另一个优点,即工作速度更快:)