如何在 pyspark 中处理 Glue 数据目录中的空表

Posted

技术标签:

【中文标题】如何在 pyspark 中处理 Glue 数据目录中的空表【英文标题】:How to handle empty table from Glue's data catalog in pyspark 【发布时间】:2019-01-28 08:43:11 【问题描述】:

我想通过 AWS Glue 在 SageMaker 上执行 SparkSQL,但没有成功。

我想做的是参数化胶水工作,所以我希望访问空表是可以接受的。但是,当为方法glueContext.create_dynamic_frame.from_catalog 提供空表时,会引发错误。

这是引发错误的代码:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

glueContext = GlueContext(SparkContext.getOrCreate())

df1 = glueContext.create_dynamic_frame.from_catalog(
    database = "<glue's database name>",
    table_name = "<glue's table name>",  # I want here to be parameterized
    transformation_ctx = "df1"
)
df1 = df1.toDF()  # Here raises an Error
df1.createOrReplaceTempView('tmp_table')
df_sql = spark.sql("""SELECT ...""")

这是错误:

Unable to infer schema for Parquet. It must be specified manually.

是否不能使用空表作为 DynamicFrame 的输入?提前谢谢你。

【问题讨论】:

您能否确认该表是否已分区,如果是,那么它是使用 hive 样式分区,即 s3 中的 year=2018/month=10 还是仅 2018/10 ? 你能在.toDF()之前检查df1.rdd.isEmpty()吗? @bdcloud 表已分区,样式类似s3中的year=2018/month=10。我在from_catalog 方法中通过push_down_predicate 选项指示分区。由于两者都不起作用,我认为这不是问题的核心。 @PavloPravdiukov 谢谢评论!我真正希望的是 SparkSQL 接受一个空表并且像 Hive 处理一个空表一样工作。但如果不起作用,我会使用isEmpty 并立即返回。 您能解释一下为什么您要尝试传递空表以及您试图通过传递空表来解决的用例是什么? 【参考方案1】:
df1 = df1.toDF()  # Here raises an Error

将此行替换为:

dynamic_df = DynamicFrame.fromDF(df1, glueContext, 'sample_job')  # Load pyspark df to dynamic frame

【讨论】:

以上是关于如何在 pyspark 中处理 Glue 数据目录中的空表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 PySpark 的 WHERE 子句在 AWS Glue 中查询 JDBC 数据库?

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

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

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

如何从aws glue pyspark作业中的嵌套数组中提取数据

字符串长度超过 Glue 中的 DDL 长度(python,pyspark)