簡體   English   中英

Pyspark DataFrame - 如何使用變量進行連接?

[英]Pyspark DataFrame - How to use variables to make join?

我在python上使用Spark數據幀在兩個數據幀上進行連接時遇到了一些麻煩。 我有兩個數據框,我必須更改列的名稱,以使它們對每個數據框唯一,所以稍后我可以告訴哪個列是哪個。 我這樣做是為了重命名列(firstDf和secondDf是使用函數createDataFrame創建的Spark DataFrames):

oldColumns = firstDf.schema.names
newColumns = list(map(lambda x: "{}.{}".format('firstDf', x), oldColumns))
firstDf = firstDf.toDF(*newColumns)

我為第二個DataFrame重復了這個。 然后我嘗試使用以下代碼加入它們:

from pyspark.sql.functions import *

firstColumn = 'firstDf.firstColumn'
secondColumn = 'secondDf.firstColumn'
joinedDF = firstDf.join(secondDf, col(firstColumn) == col(secondColumn), 'inner')

像這樣使用它我得到以下錯誤:

AnalysisException“無法解析'firstDf.firstColumn'給定的輸入列:[firstDf.firstColumn,...];”

這只是為了說明列存在於輸入列數組中。

如果我不重命名DataFrames列,我可以使用這段代碼加入它們:

joinedDf = firstDf.join(secondDf, firstDf.firstColumn == secondDf.firstColumn, 'inner')

但這給了我一個含有模糊列名的DataFrame。

關於如何處理這個的任何想法?

一般來說,不要在名稱中使用點。 這些具有特殊含義(可用於確定表或訪問struct字段),並且需要正確識別一些額外的工作。

對於equi連接,您只需要一個列名:

from pyspark.sql.functions import col

firstDf = spark.createDataFrame([(1, "foo")], ("firstColumn", "secondColumn"))
secondDf = spark.createDataFrame([(1, "foo")], ("firstColumn", "secondColumn"))

column = 'firstColumn'
firstDf.join(secondDf, [column], 'inner')

## DataFrame[firstColumn: bigint, secondColumn: string, secondColumn: string]

對於復雜的情況,請使用表別名:

firstColumn = 'firstDf.firstColumn'
secondColumn = 'secondDf.firstColumn'

firstDf.alias("firstDf").join(
    secondDf.alias("secondDf"),
    # After alias prefix resolves to table name
    col(firstColumn) == col(secondColumn),
   "inner"
)

## DataFrame[firstColumn: bigint, secondColumn: string, firstColumn: bigint, secondColumn: string]

您也可以直接使用父框架:

column = 'firstColumn'

firstDf.join(secondDf, firstDf[column] == secondDf[column])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM