从 AWS Glue/PySpark 中的 100 个表中选择数据

Posted

技术标签:

【中文标题】从 AWS Glue/PySpark 中的 100 个表中选择数据【英文标题】:Selecting data from 100 tables in AWS Glue/PySpark 【发布时间】:2020-06-03 06:20:13 【问题描述】:

我在 AWS Glue 目录中有一个包含 100 个表的目录,格式为:

user_1
user_2
...
user_100

每个表格都有这种格式:

| id | user_id | date     | expense |
|----|---------|----------|---------|
| 1  | 1       | 20200521 | 200     |
| 2  | 2       | 20200601 | 100     |
| 3  | 1       | 20200603 | 90      |

每个表都有相同的架构,其中一列是费用(int 类型)。 每个用户行被随机插入到这 100 个表中。

我想要做的是检查给定用户的每个表的费用列的总和。

与创建 100 个动态帧并加入它们相比,最有效的方法是什么?我想我需要为每个表创建 100 个数据源,但是有没有更简单的方法可以从所有 100 个表中为给定用户选择行并得到总和?

谢谢。

【问题讨论】:

从所有这些表中创建一个view(联合所有 user_1...100)并立即查询。语法-docs.databricks.com/spark/latest/spark-sql/language-manual/… 谢谢羽衣甘蓝。我将在 Redshift 中创建视图,因为我的数据源在 Redshift 中。 【参考方案1】:

您正在使用粘合目录,因此数据必须位于 s3 中。 因此,您可以在 s3 上创建所有表路径的列表并将它们作为一个 df 读取。这样您也可以应用下推条件。

Path = [path1, path2 .....path100]
Df = spark.read.csv(*path)

Df.groupby('user_id').agg(sum(expense)).show()

【讨论】:

谢谢。实际上数据来自 Redshift 表。是否可以对目录中的表名做类似的事情? 您可以在 Redshift 中创建这 100 个表的视图。 Redshift 现在也支持物化视图,它会自动更新。然后使用 redshift 连接直接从该视图读取数据。 谢谢耆那教。在 Redshift 中创建物化视图听起来是最有效的方法。干杯!

以上是关于从 AWS Glue/PySpark 中的 100 个表中选择数据的主要内容,如果未能解决你的问题,请参考以下文章

从aws glue pyspark作业中的s3加载JSON

aws glue / pyspark - 如何使用 Glue 以编程方式创建 Athena 表

AWS Glue PySpark 无法计算记录

如何在 AWS Glue PySpark 中运行并行线程?

AWS Glue PySpark 替换 NULL

AWS Glue pyspark UDF