Fitter Spark RDD基于不同RDD的过滤结果

时间:2015-11-18 20:44:03

标签: apache-spark pyspark rdd

conf = SparkConf().setAppName("my_app")
with SparkContext(conf=conf) as sc:
    sqlContext = SQLContext(sc)
    df = sqlContext.read.parquet(*s3keys)

    # this gives me distinct values as list
    rdd = df.filter(
            (1442170800000 <= df.timestamp) & (
                df.timestamp <= 1442185200000) & (
                    df.lat > 40.7480) & (df.lat < 40.7513) & (
                        df.lon > -73.8492) & (
                            df.lon < -73.8438)).map(lambda p: p.userid).distinct()

    # how do I apply the above list to filter another rdd? 
    df2 = sqlContext.read.parquet(*s3keys_part2)
    # example:
    rdd = df2.filter(df2.col1 in (rdd values from above))

2 个答案:

答案 0 :(得分:1)

正如Matthew Graves 所提到的,你需要的是一个联接。这或多或少意味着:

SELECT
  v.Node,
  n.Attribute,
  v.V_NAME,
  v.color
from Nodes n inner join Vector v
  on n.Name = v.Node and n.Date = v.Date

答案 1 :(得分:0)

这是Scala代码,而不是Python,但希望它仍然可以作为一个例子。

val x = 1 to 9
val df2 = sc.parallelize(x.map(a => (a,a*a))).toDF()
val df3 = sc.parallelize(x.map(a => (a,a*a*a))).toDF()

这为我们提供了两个数据帧,每个数据帧都有一个名为_1和_2的列,它们是前9个自然数和它们的正方形/立方体。

val fil = df2.filter("_1 < 5") // Nine is too many, let's go to four.
val filJoin = fil.join(df3,fil("_1") === df3("_1")
filJoin.collect

这让我们:

Array[org.apache.spark.sql.Row] = Array([1,1,1,1], [2,4,2,8], [3,9,3,27], [4,16,4,64])

要将此问题应用于您的问题,我会从以下内容开始:

rdd2 = rdd.join(df2, rdd.userid == df2.userid, 'inner')

但请注意,我们需要告诉它要加入哪些列,这可能不是userid df2的其他内容。我还建议您使用map(lambda p: p.userid)代替.select('userid').distinct(),以便它仍然是数据框。

您可以找到有关加入here的更多信息。