Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/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
Join 使用多个键连接两个数据帧_Join_Apache Spark_Dataframe_Pyspark_Rdd - Fatal编程技术网

Join 使用多个键连接两个数据帧

Join 使用多个键连接两个数据帧,join,apache-spark,dataframe,pyspark,rdd,Join,Apache Spark,Dataframe,Pyspark,Rdd,我有两个数据帧,一个是id和随机值,另一个是id和值的元组。 我想用我在第一个数据帧中生成的相应随机值替换id的元组。 我把它编码了,但结果不好 范例 id2word=sc.parallelize([(1),(2),(3)]) def build_data(j): a=random.uniform(-0.5,0.5) return (j,a) rdd1 = id2word.map(build_data).toDF(['id_word','value']) +-------+----

我有两个数据帧,一个是id和随机值,另一个是id和值的元组。 我想用我在第一个数据帧中生成的相应随机值替换id的元组。 我把它编码了,但结果不好

范例

id2word=sc.parallelize([(1),(2),(3)])

def build_data(j):
  a=random.uniform(-0.5,0.5)
  return (j,a)

rdd1 = id2word.map(build_data).toDF(['id_word','value'])

+-------+-------------------+
|id_word|              value|
+-------+-------------------+
|      1| 0.4651491097313888|
|      2|0.32978333933864534|
|      3|0.32978333933864534|
+-------+-------------------+

rdd2 = sc.parallelize([(1,2,1), (1,3, 0), (2,3,1)]).toDF(['id_main','id_context','coocur'])

+-------+----------+------+
|id_main|id_context|coocur|
+-------+----------+------+
|      1|         2|     1|
|      1|         3|     0|
|      2|         3|     1|
+-------+----------+------+
目标是用rdd1中定义的id_单词值替换id_主值和id_上下文值。 为了实现它,我使用了连接,但结果一点也不一致。我不明白为什么

df=rdd1.join(rdd2,rdd1.id_word==rdd2.id_main).select(rdd2.id_context,rdd1.value,rdd2.coocur)
df2=rdd1.join(df,df.id_context==rdd1.id_word)
这是我的结果,结果并不好,因为对于coocur 0,我应该得到id_word=1(0.4651491097313888)和id_word=3(0.32978333933864534),而我得到的是0.32978333933864534和0.32978333933864534

+-------------------+-------------------+------+
|              value|              value|coocur|
+-------------------+-------------------+------+
|0.32978333933864534|0.32978333933864534|     0|
|0.32978333933864534|0.32978333933864534|     1|
| 0.4651491097313888| 0.4651491097313888|     1|
+-------------------+-------------------+------+

我认为您两次拉同一列的“value”。为了安全起见,我已经用“id_main”和“id_context”为值列添加了别名,它们按照预期工作

>>> def build_data(j):
...    import random
...    a=random.uniform(-0.5,0.5)
...    return (j,a)
...
>>> rdd1 = sc.parallelize(map(lambda x: build_data(x) ,range(1,4))).toDF(['id_word','value'])
>>> rdd2 = sc.parallelize([(1,2,1), (1,3, 0), (2,3,1)]).toDF(['id_main','id_context','coocur'])
>>> temp = rdd2.join(rdd1, rdd2.id_main == rdd1.id_word).select(rdd1.value.alias('id_main'),rdd2.id_context,rdd2.coocur)
>>> result = temp.join(rdd1, temp.id_context == rdd1.id_word).select(temp.id_main, rdd1.value.alias('id_context'), rdd2.coocur)

>>> rdd1.show()
+-------+--------------------+
|id_word|               value|
+-------+--------------------+
|      1| 0.14148875937228922|
|      2| 0.22399596259278198|
|      3|-0.10276714457192437|
+-------+--------------------+

>>> result.show()
+-------------------+--------------------+------+
|            id_main|          id_context|coocur|
+-------------------+--------------------+------+
|0.14148875937228922|-0.10276714457192437|     0|
|0.22399596259278198|-0.10276714457192437|     1|
|0.14148875937228922| 0.22399596259278198|     1|
+-------------------+--------------------+------+

我认为您两次拉同一列的“value”。为了安全起见,我已经用“id_main”和“id_context”为值列添加了别名,它们按照预期工作

>>> def build_data(j):
...    import random
...    a=random.uniform(-0.5,0.5)
...    return (j,a)
...
>>> rdd1 = sc.parallelize(map(lambda x: build_data(x) ,range(1,4))).toDF(['id_word','value'])
>>> rdd2 = sc.parallelize([(1,2,1), (1,3, 0), (2,3,1)]).toDF(['id_main','id_context','coocur'])
>>> temp = rdd2.join(rdd1, rdd2.id_main == rdd1.id_word).select(rdd1.value.alias('id_main'),rdd2.id_context,rdd2.coocur)
>>> result = temp.join(rdd1, temp.id_context == rdd1.id_word).select(temp.id_main, rdd1.value.alias('id_context'), rdd2.coocur)

>>> rdd1.show()
+-------+--------------------+
|id_word|               value|
+-------+--------------------+
|      1| 0.14148875937228922|
|      2| 0.22399596259278198|
|      3|-0.10276714457192437|
+-------+--------------------+

>>> result.show()
+-------------------+--------------------+------+
|            id_main|          id_context|coocur|
+-------------------+--------------------+------+
|0.14148875937228922|-0.10276714457192437|     0|
|0.22399596259278198|-0.10276714457192437|     1|
|0.14148875937228922| 0.22399596259278198|     1|
+-------------------+--------------------+------+

我知道,但当我使用随机函数生成值时,它不起作用。你能用你得到的结果更新问题吗@samymustek我已经更新了我的结果,以使用您的
build\u data
函数。我得到了预期的结果。你能证明你所说的不连贯的结果是什么意思吗?你能在你的问题中公布你得到的结果吗?解释“不好”是什么意思最后一个数据帧是我的结果,你可以看到它不匹配,但看起来你在代码中解决了问题我知道,但当我使用随机函数生成值时,它不起作用。你能用你得到的结果更新问题吗@samymustek我已经更新了我的结果,以使用您的
build\u data
函数。我得到了预期的结果。你能证明你所说的不连贯的结果是什么意思吗?你能在你的问题中公布你得到的结果吗?解释“不好”是什么意思最后一个数据帧是我的结果,你可以看到它不匹配,但看起来你在代码中解决了问题