现在我的方法效率低下:
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分钟。
答案 0 :(得分:1)
在第一个示例中,您将收集驱动程序节点上的所有数据,并在python中处理它。您没有获得使用Spark的好处,因为该方法尚未分发。
第二种方法使用spark SQL并进行分发。您也可以使用RDD apis,如下所示。 RDD API更灵活,但通常稍慢。如果您可以使用数据框API(或上面的SQL),请坚持使用。
ids = [...]
data.rdd.filter(lambda x: x.id in ids).collect()