web-dev-qa-db-ja.com

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')
30
user3803714

&/|演算子を使用し、 演算子の優先順位 に注意する必要があります(==はビットごとの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|
## +---+---+---+---+---+---+
55
zero323

別のアプローチは次のとおりです。

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.などのエラーが発生するリスクが減少することです。


2つのテーブルの列に異なる名前がある場合(上記の例では、df2y1y2y4の列がある場合)、次の構文を使用できます。

df = df1.join(df2.withColumnRenamed('y1','x1').withColumnRenamed('y2','x2'), ['x1','x2'])
28
Florian