从数据框中的日期时差中导出列值,并将其输入另一列

时间:2017-03-21 23:12:47

标签: apache-spark dataframe pyspark spark-dataframe pyspark-sql

我是新手(使用python)并且已经搜索了我想要做的事情的解决方案,但是没有找到与此相关的任何内容。

我有两个数据框,一个名为数量,另一个名为价格

数量
+ ---- + ----- + ----- + ---- +
| ID | Price_perf |尺寸|的SourceID |
+ ---- + ----- + ----- + ---- +
| 1 | NULL | 3 | 223 |
| 1 | NULL | 3 | 223 |
| 1 | NULL | 3 | 220 |
| 2 | NULL | 6 | 290 |
| 2 | NULL | 6 | 270 |
+ ---- + ----- + ----- + ---- +

价格
+ ---- + ----- + ----- + ---- +
| ID |价格|大小|日期|的SourceID |
+ ---- + ----- + ----- + ---- +
| 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 | Price_perf |价格|日期|尺寸|的SourceID |
+ ---- + ----- + ----- + ---- +
| 1 | NULL | 7.5 | 2017-01-03 | 3 | 223 |
| 1 | NULL | 9 | 2012-01-06 | 3 | 223 |
| 1 | NULL | 12 | 2009-04-01 | 3 | 223 |
| 1 | NULL | 28 | 2011-11-08 | 3 | 223 |
| 1 | NULL | 9 | 2012-09-12 | 3 | 223 |
| 1 | NULL | 15 | 2017-07-03 | 3 | 220 |
| 1 | NULL | 10 | 2017-05-03 | 3 | 220 |
| 1 | NULL | 33 | 2012-03-08 | 3 | 220 |
+ ---- + ----- + ----- + ---- +

其次,在加入之后,我试图在联接数据框中的 min max 日期之间获得价格差异并输入作为 Price_perf

这是我尝试过的:

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 | Price_perf |价格|日期|尺寸|的SourceID |
+ ---- + ----- + ----- + ---- +
| 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 |
+ ---- + ----- + ----- + ---- +

1 个答案:

答案 0 :(得分:0)

如果您只想要匹配,那么您实际上需要内部联接,这是默认类型。然后,由于您的列名相同,您可以将它们列出,以便结果连接只有一列而不是2.尽管通常您需要使用&&而不是多个谓词的逗号

c = quantity.join(price,['id','sourceid'])
c.show()

就你的price_perf而言,我不确定你真正想要的是什么。最小值和最大值将在相同的数据中保持不变,因此您的示例目前没有多大意义。