如何从Spark中的ID列表中找到包含id的所有数据?

时间:2016-07-20 15:29:47

标签: python-2.7 hadoop apache-spark

现在我的方法效率低下:

ids = [...]
matched = []
    for id in ids:
        d = data.where(data.id == id)
        d = d.take(1)
        matched.append(d[0][3])

我想知道如何更快地完成这项工作? 数据包含4列,其中第四列包含ID。

-UPDATE -

也许是这样的?

sqlContext = SQLContext(sc)
sqlContext.registerDataFrameAsTable(data, "data")
s = ','.join(str(e) for e in ids)
q = "SELECT * FROM data WHERE id IN (" + s + ")")
sqlContext.sql(q).collect()

在上述方法中需要5分钟而不是40分钟。

1 个答案:

答案 0 :(得分:1)

在第一个示例中,您将收集驱动程序节点上的所有数据,并在python中处理它。您没有获得使用Spark的好处,因为该方法尚未分发。

第二种方法使用spark SQL并进行分发。您也可以使用RDD apis,如下所示。 RDD API更灵活,但通常稍慢。如果您可以使用数据框API(或上面的SQL),请坚持使用。

ids = [...]
data.rdd.filter(lambda x: x.id in ids).collect()