我正在嘗試創建一個函式,該函式將使用串列作為引數來反透視 PySpark 資料幀。
例如,這里有兩個串列的代碼:
1 -ignored_columns_list用于忽略(未使用)的列
2 -non_pivot_column_list我不想取消透視的列。
其余所有列均未旋轉。
功能:
import pyspark.sql.functions as F
ignored_columns_list = ['column_name1'] # columns that I don't need
non_pivot_column_list = ['column_name2'] # columns I don't want to unpivot
def unpivot_columns_final(kpi_rf_df,ignored_columns_list,non_pivot_column_list):
ignored_columns_df = kpi_rf_df.drop(*ignored_columns_list) # columns that I don't need
non_pivot_column_df = kpi_rf_df.select(*non_pivot_column_list) # columns I don't want to unpivot
unpivot_columns_df = kpi_rf_df.drop(*ignored_columns_list,*non_pivot_column_list) # Columns that I want to unpivot
unpivot_columns_df_count = len(unpivot_columns_df.columns) # count columns to use inside Expr function
unpivot_df = kpi_rf_df.select(*ignored_columns_df.columns,F.expr(f"stack({unpivot_columns_df_count}, {', '.join(unpivot_columns_df.columns)}) as (value)"))
unpivot_df = unpivot_df.select(*non_pivot_column_df.columns, F.expr(f"stack({unpivot_columns_df_count}, {str(unpivot_columns_df.columns)[1:-1]}) as (kpi)"),'value')
return unpivot_df
問題是,有時當我更改串列中的列時,我會收到此錯誤:
AnalysisException:由于資料型別不匹配,無法決議'stack(6,column_name1,column_name2,column_name3,column_name4,column_name5,column_name6)':引數1(雙精度)!=引數6(日期);第 1 行第 0 行;
我試圖對 中的列串列進行排序expr,但沒有幫助。
uj5u.com熱心網友回復:
出于好奇,您可以看看這個答案。對于與您的問題非常相似的問題,有一種簡化的方法。只能添加一些列以完全匹配您的情況。
你的功能有效!但是您必須知道,您不能stack將包含不同資料型別的列放在一起。我們可以看到,現在您正試圖將double型別的列和date型別的列堆疊在一起。Spark 不知道應將哪種資料型別分配給結果列,因此您會收到此錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519570.html
