Как объединить несколько столбцов в Pyspark?
Я использую Spark 1.3 и хотел бы присоединиться к нескольким столбцам, используя интерфейс python (SparkSQL)
Следующие работы:
Я сначала регистрирую их как временные таблицы.
numeric.registerTempTable("numeric")
Ref.registerTempTable("Ref")
test = numeric.join(Ref, numeric.ID == Ref.ID, joinType='inner')
Теперь я хотел бы присоединиться к ним на основе нескольких столбцов.
Я получаю SyntaxError
: недопустимый синтаксис с этим:
test = numeric.join(Ref,
numeric.ID == Ref.ID AND numeric.TYPE == Ref.TYPE AND
numeric.STATUS == Ref.STATUS , joinType='inner')
Ответы
Ответ 1
Вы должны использовать &
/|
и будьте осторожны с приоритетами операторов (==
имеет меньший приоритет, чем побитовые AND
и OR
):
df1 = sqlContext.createDataFrame(
[(1, "a", 2.0), (2, "b", 3.0), (3, "c", 3.0)],
("x1", "x2", "x3"))
df2 = sqlContext.createDataFrame(
[(1, "f", -1.0), (2, "b", 0.0)], ("x1", "x2", "x3"))
df = df1.join(df2, (df1.x1 == df2.x1) & (df1.x2 == df2.x2))
df.show()
## +---+---+---+---+---+---+
## | x1| x2| x3| x1| x2| x3|
## +---+---+---+---+---+---+
## | 2| b|3.0| 2| b|0.0|
## +---+---+---+---+---+---+
Ответ 2
Альтернативный подход будет:
df1 = sqlContext.createDataFrame(
[(1, "a", 2.0), (2, "b", 3.0), (3, "c", 3.0)],
("x1", "x2", "x3"))
df2 = sqlContext.createDataFrame(
[(1, "f", -1.0), (2, "b", 0.0)], ("x1", "x2", "x4"))
df = df1.join(df2, ['x1','x2'])
df.show()
какие выводы:
+---+---+---+---+
| x1| x2| x3| x4|
+---+---+---+---+
| 2| b|3.0|0.0|
+---+---+---+---+
Основным преимуществом является то, что столбцы, к которым объединяются таблицы, не дублируются в выходных данных, что снижает риск возникновения ошибок, таких как org.apache.spark.sql.AnalysisException: Reference 'x1' is ambiguous, could be: x1#50L, x1#57L.
Когда столбцы в этих двух таблицах имеют разные имена (скажем, в приведенном выше df2
столбцы df2
столбцы y1
, y2
и y4
), вы можете использовать следующий синтаксис:
df = df1.join(df2.withColumnRenamed('y1','x1').withColumnRenamed('y2','x2'), ['x1','x2'])