[英]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.