Apache spark 从数据帧中的日期-时间差派生列值,并将其输入到另一列中
我是spark(使用python)的新手,一直在寻找解决方案,但没有找到与此相关的任何内容 我有两个数据帧,一个叫做数量,另一个叫做价格 数量Apache spark 从数据帧中的日期-时间差派生列值,并将其输入到另一列中,apache-spark,dataframe,pyspark,spark-dataframe,pyspark-sql,Apache Spark,Dataframe,Pyspark,Spark Dataframe,Pyspark Sql,我是spark(使用python)的新手,一直在寻找解决方案,但没有找到与此相关的任何内容 我有两个数据帧,一个叫做数量,另一个叫做价格 数量 +----+-----+-----+----+ |ID |价格|性能|尺寸|来源ID | +----+----+----+---+ |1 |空| 3 | 223 | |1 |空| 3 | 223 | |1 |空| 3 | 220 | |2 |空| 6 | 290 | |2 |空| 6 | 270 | +----+-----+-----+----+ 价格
+----+-----+-----+----+
|ID |价格|性能|尺寸|来源ID |
+----+----+----+---+
|1 |空| 3 | 223 |
|1 |空| 3 | 223 |
|1 |空| 3 | 220 |
|2 |空| 6 | 290 |
|2 |空| 6 | 270 |
+----+-----+-----+----+ 价格
+----+-----+-----+----+
|ID |价格|尺寸|日期|来源ID |
+----+----+----+---+
|1 | 7.5 | 3 | 2017-01-03 | 223 |
|1 | 39 | 3 | 2012-01-06 | 223 |
|1 | 12 | 3 | 2009-04-01 | 223 |
|1 | 28 | 3 | 2011-11-08 | 223 |
|1 | 9 | 3 | 2012-09-12 | 223 |
|1 | 15 | 3 | 2017-07-03 | 220 |
|1 | 10 | 3 | 2017-05-03 | 220 |
|1 | 33 | 3 | 2012-03-08 | 220 |
+----+-----+-----+----+ 首先,我尝试连接上述两个数据帧并返回一个数据帧,该数据帧只包含具有相同ID和SourceID的值 我已尝试通过以下方式做到这一点:
c= quantity.join(price,price.id==quantity.id, price.souceid==quantity.sourceid "left")
c.show()
这是我想要的结果,但我没有得到:
+----+-----+-----+----+|ID |价格|性能|价格|日期|尺寸|来源ID |
+----+----+----+---+
|1 |空| 7.5 | 2017-01-03 | 3 | 223 |
|1 |空| 9 | 2012-01-06 | 3 | 223 |
|1 |空| 12 | 2009-04-01 | 3 | 223 |
|1 |空| 28 | 2011-11-08 | 3 | 223 |
|1 |空| 9 | 2012-09-12 | 3 | 223 |
|1 |空| 15 | 2017-07-03 | 3 | 220 |
|1 |空| 10 | 2017-05-03 | 3 | 220 |
|1 |空| 33 | 2012-03-08 | 3 | 220 |
+----+-----+-----+----+ 其次,在执行联接之后,我尝试获取联接数据帧中min和max日期之间的价格差,并将其作为价格性能输入 这就是我尝试过的:
def modify_values(c):
for x in c:
if quantity.sourceid == price.sourceid:
return price.price(min(Date)) - price.price(max(Date))
else:
return "Not found"
ol_val = udf(modify_values, StringType())
ol_val.show()
因此,最终输出应该如下所示:
+----+-----+-----+----+|ID |价格|性能|价格|日期|尺寸|来源ID |
+----+----+----+---+
|1 | 4.5 | 7.5 | 2017-01-03 | 3 | 223 |
|1 | 4.5 | 9 | 2012-01-06 | 3 | 223 |
|1 | 4.5 | 12 | 2009-04-01 | 3 | 223 |
|1 | 4.5 | 28 | 2011-11-08 | 3 | 223 |
|1 | 4.5 | 9 | 2012-09-12 | 3 | 223 |
|1 | 18 | 15 | 2017-07-03 | 3 | 220 |
|1 | 18 | 10 | 2017-05-03 | 3 | 220 |
|1 | 18 | 33 | 2012-03-08 | 3 | 220 |
+----+-----+-----+----+如果您只需要匹配,那么您实际上需要一个内部联接,这是默认类型。然后,由于列名相同,您可以将它们列出来,这样生成的联接每个只有一列,而不是两列。虽然对于多个谓词,通常需要使用&&而不是逗号
c = quantity.join(price,['id','sourceid'])
c.show()
至于你们的价格,我不确定你们到底想要什么。最小值和最大值将在相同的数据中保持不变,因此您的示例目前没有太多意义。Hi@justin,谢谢您的评论。。。关于price_perf,我的行数比我在df中指出的要多,我在示例中添加了更多的行,以增强理解。但我想计算出最高和最低日期的价格差异(实际数据中大约有1000个日期和价格),然后这部分就不必削减了。您在这里面临一个SQL问题: