我正在尝试将三个不同的DataFrame连接到一个但是我在加入这三个时遇到了麻烦。我已经能够加入两个。
如何正确加入三个DataFrame?
Pyspark:1.6.0
以下是我目前的工作:
# EXPECTED OUTPUT:
# -------file1.csv---------|---file2.csv--|---file3.csv------------|
# |col1|col2|col3|col4|col5|col1|col2|col3|col1|col2|col3|col4|col5|
# Loading in all the files
file1_rdd = sc.textFile("file1.csv").map(lambda line: line.split(","))
file2_rdd = sc.textFile("file2.csv").map(lambda line: line.split(","))
file3_rdd = sc.textFile("file3.csv").map(lambda line: line.split(","))
# Capturing the header
file1_header = file1_rdd.first()
file2_header = file2_rdd.first()
file3_header = file3_rdd.first()
# Removing the header from the table rows
df_file1 = file1_rdd.filter(lambda row : row != file1_header).toDF(file1_header)
df_file2 = file1_rdd.filter(lambda row : row != file2_header).toDF(file2_header)
df_file3 = file1_rdd.filter(lambda row : row != file3_header).toDF(file3_header)
# WORKS: df_file1.join(df_file2, df_file1.col1 == df_file2.col2)
# OUTPUT:
# -------file1.csv---------|---file2.csv--|
# |col1|col2|col3|col4|col5|col1|col2|col3|
# DOES NOT WORK: df_file1.join(df_file2, df_file1.col1 == df_file2.col2).join(df_file3, df_file2.col2 == df_file3.col2)
# OUTPUT:
# Caused by: java.lang.IllegalStateException: Input row doesn't have expected number of values required by the schema. 4 fields are required while 5 values are provided.
为什么在我可以加入前两个没有该错误的情况下需要4个字段时出现错误,即使这些字段的长度不同?
答案 0 :(得分:0)
问题是file3.csv
包含未经过适当清理的数据。为了解决这个问题,我只是强制执行最大分割:
file3_rdd = sc.textFile("file3.csv").map(lambda line: line.split(",", 3))
对于可能遇到过类似问题的任何读者:检查您是否可以独立查看表格而不会出现错误。执行df_file3.show()
会返回相同的错误,并且可以帮助我更快地查看问题。