pyspark使用' in'将一个RDD提供给另一个RDD。条款

时间:2017-08-23 21:17:23

标签: pyspark spark-dataframe rdd pyspark-sql

我有一个pyspark RDD(# add pry(main)> my_params => <ActionController::Parameters {"prop1"=>"val1"} permitted: true> pry(main)> my_params.awesome_add(prop1: "val2") <ActionController::Parameters {"prop1"=>["val1", "val2"]} permitted: true> # remove pry(main)> my_params.awesome_remove(prop1: "val1") => <ActionController::Parameters {"prop1"=>"val2"} permitted: true> ),它是一个可变长度的ID列表,例如

myRDD

我有一个包含[['a', 'b', 'c'], ['d','f'], ['g', 'h', 'i','j']] 列和myDF列的pyspark数据框(ID)。

我想使用查询查询value

myDF

其中outputDF = myDF.select(F.collect_set("value")).alias("my_values").where(col("ID").isin(id_list)) 是来自id_list的元素,例如[&#39; d&#39;,&#39; f&#39;]或[&#39; a&#39} ;,&#39; b&#39;,&#39; c&#39;]。

一个例子是:

myRDD

使用RDD像这样查询DF的可并行化方法是什么?

1 个答案:

答案 0 :(得分:0)

考虑您的数据框列&#34; ID&#34;属于y类型,您希望保留显示在任何RDD行中的ID值。

首先,让我们将RDD转换为一列数据帧,每行包含一个唯一ID:

stringType()

我们将对其进行探讨,以便每行只有一个ID值:

from pyspark.sql import HiveContext
hc = HiveContext(sc)
ID_df = hc.createDataFrame(
    myRDD.map(lambda row: [row]), 
    ['ID']
).withColumn("uniqueID", psf.monotonically_increasing_id())

我们现在可以加入原始数据框,内部联接将用作过滤器:

import pyspark.sql.functions as psf
ID_df = ID_df.withColumn('ID', psf.explode(ID_df.ID))

myDF = myDF.join(ID_df, "ID", "inner) 是一个聚合函数,因此在使用它之前需要collect_set,例如新创建的行ID:

groupBy