2016-10-03 22 views
0

我不確定爲什麼會發生這種情況。在PySpark中,我讀了兩個數據框並列出了它們的列名,並且它們與預期的一樣,但是,當執行SQL連接時,出現無法解析列名的錯誤。我簡化了合併來實現它,但是我需要添加更多的連接條件,這就是我使用SQL的原因(將添加到:「and b.mnvr_bgn < a.idx_trip_id and b.mnvr_end> a.idx_trip_data「)。看來,列「DEVICE_ID」被更名爲「_col7」在DF mnvr_temp_idx_prev_temp列名無法在SparkSQL中解析加入

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_id’給定的輸入欄:[_col7,trip_id,device_id,mnvr_end,mnvr_bgn,idx_trip_end];第1行pos 237「

任何幫助表示讚賞!

+0

請發佈您的完整代碼 –

+0

我的整個代碼大約有1000行,因此這不是一個真正的選項 – Amber

+0

您是否嘗試將DataFrame用於Join而不是sql語句?沒有什麼區別,但是想知道Dataframes中是否也存在相同的問題。 – dheee

回答

1

我會建議在至少一個數據框中重命名字段'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 *',它將起作用。但是,如果您嘗試選擇'device_id',則會出現錯誤「參考'device_id'不明確」。正如你在上面的'test'數據框定義中看到的那樣,它有兩個同名的字段(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") 

//在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") 

以上的查詢將針對您的問題的工作。如果數據集太大,我建議不要在連接條件中使用'>'或'<'運算符,因爲它會導致交叉連接,如果數據集很大,這是一個代價高昂的操作。請在WHERE條件中使用它們。

+0

爲您的第一條評論,我嘗試使用數據框連接並得到相同的錯誤。 重命名其中一個數據框中的列可解決問題!現在它全部按預期運行。謝謝! 感謝您建議在where語句而不是連接中使用'>'和'<'...我的數據真的很大,我不知道在連接vs哪裏。所以這個建議非常感謝! – Amber

+0

@Amber很高興工作。 – dheee

相關問題