【发布时间】:2019-03-10 07:18:17
【问题描述】:
我正在执行从 S3 parquet 数据到 JDBC (Postgres) 表的连接操作,使用 parquet 数据中的列到 JDBC 表的主键。我需要 JDBC 表中的一小部分(但仍然是一个很大的数量 - 总共数万或数十万行),然后我需要智能地对数据进行分区以供在执行程序中使用。
我对整个数据工程尤其是 Spark 还是个新手,所以请原谅(并假设!)我的无知。我不太关心处理时间而不是内存使用;我必须使内存使用量符合 Amazon Glue 限制。
有什么好的方法可以做到这一点?
我现有的想法:
理论上,我可以构造如下 SQL 查询:
select * from t1 where id = key1 UNION
select * from t1 where id = key2 UNION...
但是,这似乎很愚蠢。这个问题:Selecting multiple rows by ID, is there a faster way than WHERE IN 让我想到了将要拉到临时表的键写入临时表,将其与原始表连接并拉出结果;这似乎是执行上述操作的“正确”方式。但是,这似乎也是一个很常见的问题,我还没有找到现成的解决方案。
也有可能在最小/最大 UUID 值之间拉动,但问题是我拉动了多少额外的行,并且由于 UUID 是,AFAIK,随机分布在可能的 UUID 值中,我希望获得很多额外的行(在连接期间将被遗漏的行)。不过,这可能是一种对 JDBC 数据进行分区的有用方法。
我还不清楚 JDBC 数据是如何到达执行程序的;它可能(全部)通过驱动程序进程。
因此,尝试将其形式化为问题:
- 是否有适用于这种用法的现有配方?
- 我应该考虑 Spark 的哪些功能来实现此目的?
- 来自 JDBC 连接的数据的实际 Spark 数据流是什么?
【问题讨论】:
-
开箱即用的 Spark 不提供类似的功能。但是,如果您通过Russell Spitzer 搜索外部帖子,在类似情况下如何实现有用的下推。
标签: apache-spark jdbc parquet aws-glue