Pyspark 无法在SparkSQL联接中解析列名

Pyspark 无法在SparkSQL联接中解析列名,pyspark,apache-spark-sql,pyspark-sql,Pyspark,Apache Spark Sql,Pyspark Sql,我不知道为什么会这样。在PySpark中,我读入两个数据帧并打印出它们的列名,它们与预期的一样,但是当执行SQL连接时,我得到一个错误,在给定输入的情况下无法解析列名。我简化了合并只是为了让它工作,但我需要添加更多的连接条件,这就是我使用SQL的原因(将添加:“和b.mnvr_bgna.idx_trip_data”)。在dfmnvr\u temp\u idx\u prev\u temp mnvr_temp_idx_prev = mnvr_3.select('device_id', 'mnvr_b

我不知道为什么会这样。在PySpark中,我读入两个数据帧并打印出它们的列名,它们与预期的一样,但是当执行SQL连接时,我得到一个错误,在给定输入的情况下无法解析列名。我简化了合并只是为了让它工作,但我需要添加更多的连接条件,这就是我使用SQL的原因(将添加:“和b.mnvr_bgna.idx_trip_data”)。在dfmnvr\u temp\u idx\u prev\u temp

mnvr_temp_idx_prev = mnvr_3.select('device_id', 'mnvr_bgn', 'mnvr_end')
print mnvr_temp_idx_prev.columns
['device_id', 'mnvr_bgn', 'mnvr_end']

raw_data_filtered = raw_data.select('device_id', 'trip_id', 'idx').groupby('device_id', 'trip_id').agg(F.max('idx').alias('idx_trip_end'))
print raw_data_filtered.columns
['device_id', 'trip_id', 'idx_trip_end']

raw_data_filtered.registerTempTable('raw_data_filtered_temp')
mnvr_temp_idx_prev.registerTempTable('mnvr_temp_idx_prev_temp') 
test = sqlContext.sql('SELECT a.device_id, a.idx_trip_end, b.mnvr_bgn, b.mnvr_end \
                          FROM raw_data_filtered_temp as a  \
                             INNER JOIN mnvr_temp_idx_prev_temp as b \
                                ON a.device_id = b.device_id')
回溯(最后一次调用):AnalysisException:u“无法解析“b.device\u id”,给定输入列:[[u col7,trip\u id,device\u id,mnvr\u end,mnvr\u bgn,idx\u trip\u end];第1行位置237”


感谢您的帮助

我建议至少在一个数据帧中重命名字段“device_id”的名称。我只是稍微修改了一下您的查询,并(在scala中)对其进行了测试。下面的查询工作

test = sqlContext.sql("select * FROM raw_data_filtered_temp a INNER JOIN mnvr_temp_idx_prev_temp b ON a.device_id = b.device_id")
[device_id: string, mnvr_bgn: string, mnvr_end: string, device_id: string, trip_id: string, idx_trip_end: string]
现在,如果您在上面的语句中执行“select*”,它将起作用。但如果您尝试选择“设备id”,您将得到一个错误“引用“设备id”不明确”。正如您在上面的“测试”数据帧定义中所看到的,它有两个同名字段(device_id)。所以为了避免这种情况,我建议更改其中一个数据帧中的字段名

mnvr_temp_idx_prev = mnvr_3.select('device_id', 'mnvr_bgn', 'mnvr_end')
                           .withColumnRenamned("device_id","device")  

raw_data_filtered = raw_data.select('device_id', 'trip_id', 'idx').groupby('device_id', 'trip_id').agg(F.max('idx').alias('idx_trip_end'))
现在使用dataframes或sqlContext

//using dataframes with multiple conditions
  val test = mnvr_temp_idx_prev.join(raw_data_filtered,$"device" === $"device_id"
                                                   && $"mnvr_bgn" < $"idx_trip_id","inner")
//在多个条件下使用数据帧
val test=mnvr\u temp\u idx\u prev.join(原始数据已过滤,$“设备”==$“设备id”
&&$“mnvr\U bgn”<$“idx\U行程id”,“内部”)
//在SQL上下文中

 test = sqlContext.sql("select * FROM raw_data_filtered_temp a INNER JOIN mnvr_temp_idx_prev_temp b ON a.device_id = b.device and a. idx_trip_id < b.mnvr_bgn")
test=sqlContext.sql(“从原始数据中选择*\u筛选出\u temp a内部连接mnvr\u temp\u idx\u prev\u temp b在a.device\u id=b.device和a.idx\u trip\u id

以上查询将解决您的问题。如果您的数据集太大,我建议不要使用'>'或',我建议在至少一个数据帧中重命名字段'device_id'的名称。我只是稍微修改了一下您的查询,并(在scala中)对其进行了测试。下面的查询工作

test = sqlContext.sql("select * FROM raw_data_filtered_temp a INNER JOIN mnvr_temp_idx_prev_temp b ON a.device_id = b.device_id")
[device_id: string, mnvr_bgn: string, mnvr_end: string, device_id: string, trip_id: string, idx_trip_end: string]
现在,如果您在上面的语句中执行“select*”,它将起作用。但如果您尝试选择“设备id”,您将得到一个错误“引用“设备id”不明确”。正如您在上面的“测试”数据帧定义中所看到的,它有两个同名字段(device_id)。所以为了避免这种情况,我建议更改其中一个数据帧中的字段名

mnvr_temp_idx_prev = mnvr_3.select('device_id', 'mnvr_bgn', 'mnvr_end')
                           .withColumnRenamned("device_id","device")  

raw_data_filtered = raw_data.select('device_id', 'trip_id', 'idx').groupby('device_id', 'trip_id').agg(F.max('idx').alias('idx_trip_end'))
现在使用dataframes或sqlContext

//using dataframes with multiple conditions
  val test = mnvr_temp_idx_prev.join(raw_data_filtered,$"device" === $"device_id"
                                                   && $"mnvr_bgn" < $"idx_trip_id","inner")
//在多个条件下使用数据帧
val test=mnvr\u temp\u idx\u prev.join(原始数据已过滤,$“设备”==$“设备id”
&&$“mnvr\U bgn”<$“idx\U行程id”,“内部”)
//在SQL上下文中

 test = sqlContext.sql("select * FROM raw_data_filtered_temp a INNER JOIN mnvr_temp_idx_prev_temp b ON a.device_id = b.device and a. idx_trip_id < b.mnvr_bgn")
test=sqlContext.sql(“从原始数据中选择*\u筛选出\u temp a内部连接mnvr\u temp\u idx\u prev\u temp b在a.device\u id=b.device和a.idx\u trip\u id

以上查询将解决您的问题。如果您的数据集太大,我建议不要使用“>”或“请发布您的完整代码。我的整个代码大约有1000行,所以这不是一个真正的选项。您是否尝试使用DataFrames for Join而不是sql语句?没有太大的区别,但想知道是否同样的问题也发生在数据帧中。请发布完整的代码。我的整个代码大约有1000行,所以这不是一个真正的选项。您是否尝试使用数据帧来连接而不是sql语句?没有太大区别,但是想知道是否同样的问题也发生在Dataframes中。对于您的第一个评论,我尝试使用Dataframes联接,但得到了相同的错误。重命名其中一个数据帧中的列修复了该问题!现在一切都按预期运行。谢谢感谢您推荐使用“>”和“对于您的第一个评论,我确实尝试过使用dataframes联接,但得到了相同的错误。重命名其中一个数据帧中的列修复了该问题!现在一切都按预期运行。谢谢感谢您推荐使用'>'和'