我有一張表,在資料庫中。有一列“id”,每個 id 有多行。我想隨機選擇 10 個 id,然后用這些 id 加載所有行。以下是有效的,并為我提供了一個包含 10 個隨機 ID 的表。沒關系。
distinct_ids = spark.sql(f""" (SELECT DISTINCT id FROM {database_name}.{orig_table_cl_name} ORDER BY RAND() LIMIT 10)
但是現在我不知道如何與原始表進行內部聯接以獲取包含正確 id 的所有資料......我試過:
distinct_ids = spark.sql(
f""" (SELECT DISTINCT vehicle_id
FROM {database_name}.{orig_table_name}
ORDER BY RAND() LIMIT 10)
AS table
INNER JOIN table
ON {database_name}.{orig_table_name}.id = table.id""")
給我以下錯誤:
ParseException:
mismatched input 'AS' expecting {<EOF>, ';'}(line 1, pos 99)
== SQL ==
(SELECT DISTINCT vehicle_id FROM pnds12v_dev_core.t_cycle_log_car_v2_0 ORDER BY RAND() LIMIT 10) AS table
我嘗試了一堆其他的引數順序,但認為我缺少對它如何作業的一般理解......并且因為我認為在使用 spark.sql 時沒有分號,錯誤訊息沒有給我任何提示。
有人可以向我解釋如何進行這樣的查詢嗎?
uj5u.com熱心網友回復:
使用公用表運算式 (CTE) 定義臨時結果集。
distinct_ids = spark.sql(
f"""with table as
(SELECT DISTINCT vehicle_id as id
FROM {database_name}.{orig_table_name}
ORDER BY RAND() LIMIT 10)
select * from table INNER JOIN {database_name}.{orig_table_name}
ON {database_name}.{orig_table_name}.id = table.id""")
uj5u.com熱心網友回復:
分號錯誤或多或少意味著AS在那里找不到關鍵字,而用分號(查詢結束)代替它就可以了。
解決您的問題的一種方法是“反轉”sql 查詢,并將原始表與選擇 10 個隨機 ID 的輔助子句連接起來:
spark.sql(
f"""SELECT {database_name}.{orig_table_name}.*
FROM {database_name}.{orig_table_name}
INNER JOIN (select distinct {database_name}.{orig_table_name}.id ORDER BY RAND() LIMIT 10) t
ON {database_name}.{orig_table_name}.id = t.id"""
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/355174.html
