【问题标题】:Spark SQL: Select 10 randomly chosen groups of value in column of tableSpark SQL:在表的列中选择 10 个随机选择的值组
【发布时间】:2021-12-22 19:22:41
【问题描述】:

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

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

【问题讨论】:

    标签: sql apache-spark


    【解决方案1】:

    使用公用表表达式 (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""")
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多