Как вы выполняете базовые объединения двух таблиц RDD в Spark с помощью Python?
Как бы вы выполнили базовые соединения в Spark с помощью python? В R вы можете использовать merg () для этого. Каков синтаксис использования python на spark для:
- Внутреннее Соединение
- Левое Внешнее Соединение
- Перекрестное Соединение
С двумя таблицами (RDD) с одним столбцом в каждой, который имеет общий ключ.
RDD(1):(key,U)
RDD(2):(key,V)
Я думаю, что внутреннее соединение-это что-то вроде этого:
rdd1.join(rdd2).map(case (key, u, v) => (key, ls ++ rs));
Это верно? Я искал в интернете и не могу найти хороший пример соединения. Спасибо заранее.
1 ответов
это можно сделать либо с помощью PairRDDFunctions
или Spark фреймов данных. Поскольку операции фрейма данных выигрывают от Катализатор Оптимизатор второй вариант стоит рассмотреть.
предполагая, что ваши данные выглядит следующим образом:
rdd1 = sc.parallelize([("foo", 1), ("bar", 2), ("baz", 3)])
rdd2 = sc.parallelize([("foo", 4), ("bar", 5), ("bar", 6)])
С PairRDDs:
внутреннее соединение:
rdd1.join(rdd2)
левое внешнее соединение:
rdd1.leftOuterJoin(rdd2)
декартово произведение (не требует RDD[(T, U)]
):
rdd1.cartesian(rdd2)
широковещательное соединение (не require RDD[(T, U)]
):
наконец, есть cogroup
который не имеет прямого эквивалента SQL, но может быть полезен в некоторых ситуациях:
cogrouped = rdd1.cogroup(rdd2)
cogrouped.mapValues(lambda x: (list(x[0]), list(x[1]))).collect()
## [('foo', ([1], [4])), ('bar', ([2], [5, 6])), ('baz', ([3], []))]
С Фреймами Данных Spark
вы можете использовать SQL DSL или выполнить raw SQL с помощью sqlContext.sql
.
df1 = spark.createDataFrame(rdd1, ('k', 'v1'))
df2 = spark.createDataFrame(rdd2, ('k', 'v2'))
# Register temporary tables to be able to use sqlContext.sql
df1.createTempView('df1')
df2.createTempView('df2')
внутреннее соединение:
# inner is a default value so it could be omitted
df1.join(df2, df1.k == df2.k, how='inner')
spark.sql('SELECT * FROM df1 JOIN df2 ON df1.k = df2.k')
левый наружный присоединяйтесь:
df1.join(df2, df1.k == df2.k, how='left_outer')
spark.sql('SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.k = df2.k')
Cross join (явное перекрестное соединение или изменения конфигурации требуются в Spark. 2.0 - Искра.язык SQL.перекрестное соединение.включено для Spark 2.x):
df1.crossJoin(df2)
spark.sql('SELECT * FROM df1 CROSS JOIN df2')
df1.join(df2)
sqlContext.sql('SELECT * FROM df JOIN df2')
так как 1.6 (1.5 в Scala) каждый из них может быть объединен с broadcast
функция:
from pyspark.sql.functions import broadcast
df1.join(broadcast(df2), df1.k == df2.k)
для выполнения широковещательного соединения. См. также почему мой BroadcastHashJoin медленнее, чем ShuffledHashJoin в Искра!--19-->