Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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
Python 将列表中缺少的元素作为每个时间窗口组的行插入到DataFrame_Python_Scala_Apache Spark_Pyspark - Fatal编程技术网

Python 将列表中缺少的元素作为每个时间窗口组的行插入到DataFrame

Python 将列表中缺少的元素作为每个时间窗口组的行插入到DataFrame,python,scala,apache-spark,pyspark,Python,Scala,Apache Spark,Pyspark,试着从语法上解决这个问题。。。似乎是个难题。。。基本上,如果传感器项未在时间序列时间戳间隔源数据中捕获,则希望在每个时间戳窗口中为每个缺失的传感器项追加一行空值 #传感器项目列表[有300多个;仅显示4个作为示例] 列表=[“温度”、“压力”、“真空”、“燃烧器”] #样本数据 df=spark.createDataFrame([('2019-05-10 7:30:05','temp','99')\ (‘2019-05-10 7:30:05’、‘燃烧器’、‘正确’)\ (‘2019-05-10

试着从语法上解决这个问题。。。似乎是个难题。。。基本上,如果传感器项未在时间序列时间戳间隔源数据中捕获,则希望在每个时间戳窗口中为每个缺失的传感器项追加一行空值

#传感器项目列表[有300多个;仅显示4个作为示例]
列表=[“温度”、“压力”、“真空”、“燃烧器”]
#样本数据
df=spark.createDataFrame([('2019-05-10 7:30:05','temp','99')\
(‘2019-05-10 7:30:05’、‘燃烧器’、‘正确’)\
(‘2019-05-10 7:30:10’、‘真空’、‘0.15’)\
('2019-05-10 7:30:10','burner','FALSE')\
(‘2019-05-10 7:30:10’、‘临时’、‘75’)\
(‘2019-05-10 7:30:15’、‘临时’、‘77’)\
(‘2019-05-10 7:30:20’、‘压力’、‘0.22’)\
('2019-05-10 7:30:20','temp','101'),[“日期”,“项目”,“价值])
#当前困境=>当前后端设计流媒体设备中未捕获所有传感器项目/仅捕获传感器的更新
+------------------+--------+-----+
|日期|项目|价值|
+------------------+--------+-----+
|2019-05-10 7:30:05温度99|
|2019-05-10 7:30:05燃烧器正确|
|2019-05-10 7:30:10真空|
|2019-05-10 7:30:10燃烧器错误|
|2019-05-10 7:30:10温度75|
|2019-05-10 7:30:15温度77|
|2019-05-10 7:30:20压力|
|2019-05-10 7:30:20温度101|
+------------------+--------+-----+
希望捕获每个时间戳的每个传感器项,以便在数据帧旋转之前执行正向填充插补[正向填充300+列会导致scala错误=>

#所需输出
+------------------+--------+-----+
|日期|项目|价值|
+------------------+--------+-----+
|2019-05-10 7:30:05温度99|
|2019-05-10 7:30:05燃烧器正确|
|2019-05-10 7:30:05真空度为零|
|2019-05-10 7:30:05压力为零|
|2019-05-10 7:30:10真空|
|2019-05-10 7:30:10燃烧器错误|
|2019-05-10 7:30:10温度75|
|2019-05-10 7:30:10压力为零|
|2019-05-10 7:30:15温度77|
|2019-05-10 7:30:15压力为零|
|2019-05-10 7:30:15燃烧器无效|
|2019-05-10 7:30:15真空度为零|
|2019-05-10 7:30:20压力|
|2019-05-10 7:30:20温度101|
|2019-05-10 7:30:20真空度为零|
|2019-05-10 7:30:20燃烧器无效|
+------------------+--------+-----+
扩展到:

您可以将数据帧与不同日期的笛卡尔乘积和
传感器列表
右键连接。由于
传感器列表
很小,因此您可以使用它

从pyspark.sql.functions导入广播
传感器列表=[“温度”、“压力”、“真空”、“燃烧器”]
加入(
df.select('日期')\
.distinct()\
.crossJoin(广播(spark.createDataFrame([(x,)表示传感器列表中的x],“项]),
日期=[“日期”,“项目”],
how=“正确”
).sort(“日期”、“项目”).show()
#+------------------+--------+-----+
#|日期|项目|价值|
#+------------------+--------+-----+
#|2019-05-10 7:30:05燃烧器正确|
#|2019-05-10 7:30:05压力为零|
#|2019-05-10 7:30:05温度99|
#|2019-05-10 7:30:05真空度为零|
#|2019-05-10 7:30:10燃烧器错误|
#|2019-05-10 7:30:10压力为零|
#|2019-05-10 7:30:10温度75|
#|2019-05-10 7:30:10真空|
#|2019-05-10 7:30:15燃烧器无效|
#|2019-05-10 7:30:15压力为零|
#|2019-05-10 7:30:15温度77|
#|2019-05-10 7:30:15真空度为零|
#|2019-05-10 7:30:20燃烧器无效|
#|2019-05-10 7:30:20压力|
#|2019-05-10 7:30:20温度101|
#|2019-05-10 7:30:20真空度为零|
#+------------------+--------+-----+

这里有一个想法(不确定效率有多高)。创建一个临时数据框,就像交叉连接所有项目的不同日期和数据框一样:
df.select('date').distinct().crossJoin(broadcast(spark.createDataFrame([('temp',),('burner',),('vacuum',),('pressure',)],[“item]))
。现在将原始数据帧正确连接到此临时帧这很有意义!非常感谢!我将在大数据集上试一试,并让您知道它是如何运行的。此连接方法运行得非常好…因为它是广播的,所以不会发生混乱,所以性能看起来是可行的。谢谢!我有点担心戳得太早了…性能仍然正常,但是
解释计划
正在显示
嵌套广播loopjoin
我听说过关于它的恐怖故事…有什么见解吗?