我试图动态地解析select子句到pyspark dataframe,但我一直收到一个错误,说“无法解决...”给定输入列:[value];
split_col = split(df[column_name], delimiter)
file = open(schema_file, 'r')
data = csv.reader(file)
o_str = ''
for row in data:
if row[0] == rec_type:
col_names = row[1:]
for i in range(len(col_names)):
o_str += ("split_col.getItem("+str(i)+").alias('"+col_names[i]+"'),")
df_out = df.select(o_str.rsplit(',', 1)[0])
上面给出的是代码片段。这里o_str.rsplit(',', 1)[0]
解析为split_col.getItem(0).alias('RCD_TYPE'),split_col.getItem(1).alias('VER'),split_col.getItem(2).alias('ID'),split_col.getItem(3).alias('OL_IND'),split_col.getItem(4).alias('PERS_ID')
当我在select子句中硬编码值时,它工作正常,但当我尝试动态生成它时,它给出错误
An error occurred while calling o44.select.
: org.apache.spark.sql.AnalysisException: cannot resolve '`split_col.getItem(0).alias('RCD_TYPE'),split_col.getItem(1).alias('VER'),split_col.getItem(2).alias('ID'),split_col.getItem(3).alias('OL_IND'),split_col.getItem(4).alias('PERS_ID')`' given input columns: [value];;
'Project ['split_col.getItem(0).alias('RCD_TYPE'),split_col.getItem(1).alias('VER'),split_col.getItem(2).alias('ID'),split_col.getItem(3).alias('OL_IND'),split_col.getItem(4).alias('PERS_ID')']
+- Filter StartsWith(value#2, L)
+- Relation[value#2] text
df_out = df.select(split_col.getItem(0).alias('RCD_TYPE'),split_col.getItem(1).alias('VER'),split_col.getItem(2).alias('ID'),split_col.getItem(3).alias('OL_IND'),split_col.getItem(4).alias('PERS_ID')) --> This works
df_out = df.select(o_str.rsplit(',', 1)[0]) --> This does not work.
1条答案
按热度按时间icnyk63a1#
您正在尝试在Python中执行大部分计算。我建议你走公园路。我从您的代码中了解到的是,您希望跳过select子句中的特定列。如果是这样,在pyspark中这样做: