首页 > 解决方案 > Spark SQL:在表的列中选择 10 个随机选择的值组

问题描述

我有一个表,在数据库中。有一列“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 时没有分号,所以错误消息没有给我任何提示。

有人可以向我解释如何进行这样的查询吗?

标签: sqlapache-spark

解决方案


分号错误或多或少意味着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"""
)

推荐阅读