Scala SQL - 读取 id 文件,并在查询的 WHERE 子句中包含 id

Scala SQL - Read in file of ids and include id in WHERE clause in query

提问人:Teodorico Levoff 提问时间:3/15/2023 更新时间:3/15/2023 访问量:90

问:

我有一个 ids 的 txt 文件,.txt文件中每行一个 id。我想使用 Scala 编写一个简单的 SQL 查询,该查询读取这些 id 并将这些 id 包含在 where 子句中,因为我只对查询这些特定 id 的值感兴趣。BigInteger

示例 .txt 文件

1234566789
9876543212

假定 $id 是.txt中的一组 ID 或 ID 列表的示例查询。文件。

spark.sql(f"""
  SELECT
    table_x.id,
    AVG(table_x.cost)
  FROM table_x
  WHERE table_x.id = $id
  GROUP BY table_x.id
  """)

我正在寻找一些有效的东西。我想我可以加载这些 id 并将它们存储为 Scala 中的集合,并检查此集合中是否存在。但我不确定最有效的解决方案是什么,因为 ids 的.txt文件行数将超过 100k。table_x.id

SQL Scala 性能 IO

评论

0赞 iShaymus 3/15/2023
这是持续的动态查询还是一次性的?如果是一次性的,则可以从文件创建临时表,然后从表中查询 ID。同样,您可以将它们粘贴到 VSCode 或类似内容中,并将它们转换为逗号分隔的字符串列表,然后使用过滤器WHERE IN
0赞 Teodorico Levoff 3/15/2023
@iShaymus 临时表效率高吗?另外,我不确定如何将其从.txt文件解析为临时表。
0赞 iShaymus 3/15/2023
这取决于.txt文件中有多少数据,有多少个 ID?您正在使用哪些数据库和工具。我使用Oracle数据库,SQL Developer和Toad都有办法从Excel,CSV和Text文件创建表格。您的数据库解决方案可能同样具有类似的功能。如果 ID 少于 1000 个,则该选项可能是最简单的选择。WHERE IN
0赞 Teodorico Levoff 3/15/2023
大约 100k 个 ID 在 .txt.file 中
0赞 iShaymus 3/15/2023
您必须使用临时表,因为限制为 1000。您使用的是什么数据库?WHERE IN

答:

0赞 iShaymus 3/15/2023 #1

我对 Amazon RDS 不够熟悉,不知道可以使用什么 RDMS 软件将文本文件传输到数据库。也许它需要存储在 Amazon S3 上?

我不知道您在 RDS 上运行的是哪个数据库引擎,但我会举例说明 Oracle,因为这是我习惯的。

一旦你在某个地方有了文件,数据库就可以访问它,你将从文本文件创建一个新表

CREATE GLOBAL TEMPORARY TABLE MYSCHEMA.MY_ID_TABLE_NAME (
  MY_IDS varchar2(32), -- number if you're sure they will only ever be numeric
) ON COMMIT PRESERVE ROWS;

LOAD DATA
INFILE 'C:\path\to\my-super-ID-data.txt'
TRUNCATE
INTO TABLE MYSCHEMA.MY_ID_TABLE_NAME
FIELDS TERMINATED BY '\r' --carriage return can be ',' for CSV
(
  MY_IDS
)

然后,您应该有一个包含所有 ID 的单列表MYSCHEMA.MY_ID_TABLE_NAME

此时,您将按如下方式运行查询

spark.sql(f"""
  SELECT
    x.id,
    AVG(x.cost)
  FROM table_x x
  WHERE x.id IN (SELECT my_ids FROM MYSCHEMA.MY_ID_TABLE_NAME)
  GROUP BY x.id
  """)

今后,如果要使用最新的 ID 再次重新运行查询,则可以从新文件重新创建临时表,然后进行冲洗并重复。