Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Apache spark 从数据帧中的日期-时间差派生列值,并将其输入到另一列中_Apache Spark_Dataframe_Pyspark_Spark Dataframe_Pyspark Sql - Fatal编程技术网

Apache spark 从数据帧中的日期-时间差派生列值,并将其输入到另一列中

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 | +----+-----+-----+----+ 价格

我是spark(使用python)的新手,一直在寻找解决方案,但没有找到与此相关的任何内容

我有两个数据帧,一个叫做数量,另一个叫做价格

数量
+----+-----+-----+----+
|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 |
+----+-----+-----+----+

首先,我尝试连接上述两个数据帧并返回一个数据帧,该数据帧只包含具有相同IDSourceID的值

我已尝试通过以下方式做到这一点:

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 |
+----+-----+-----+----+

其次,在执行联接之后,我尝试获取联接数据帧中minmax日期之间的价格差,并将其作为价格性能输入

这就是我尝试过的:

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问题: