Apache spark 如何在AWS Glue中的Spark数据帧或Spark SQL临时表中包含分区列的值?

Apache spark 如何在AWS Glue中的Spark数据帧或Spark SQL临时表中包含分区列的值?,apache-spark,pyspark,pyspark-sql,aws-glue,pyspark-dataframes,Apache Spark,Pyspark,Pyspark Sql,Aws Glue,Pyspark Dataframes,我正在使用Python3,Glue 1.0来编写这段代码 我在S3中对数据进行了分区。数据按年、月、日、额外字段名称列进行分区 当我将数据加载到数据帧中时,我得到的是它的模式中除分区列以外的所有列 下面是代码和输出 glueContext.从选项(连接类型=“s3”,连接选项={“路径”:路径列表,“递归”:True,'groupFiles':'inPartition'},format=“parquet”).toDF().registerTempable(最终参数列表[“读取表”+str(i+1

我正在使用Python3,Glue 1.0来编写这段代码

我在S3中对数据进行了分区。数据按年、月、日、额外字段名称列进行分区

当我将数据加载到数据帧中时,我得到的是它的模式中除分区列以外的所有列

下面是代码和输出

glueContext.从选项(连接类型=“s3”,连接选项={“路径”:路径列表,“递归”:True,'groupFiles':'inPartition'},format=“parquet”).toDF().registerTempable(最终参数列表[“读取表”+str(i+1)])

path_list变量包含需要加载到数据帧中的路径列表字符串。 我正在使用下面的命令打印模式

glueContext.从选项(connection\u type=“s3”,connection\u options={“path”:path\u list,“recurse”:True},format=“parquet”).toDF().printSchema()创建动态框架

我在cloudwatch日志中得到的模式不包含任何分区列。
请注意,我已经尝试通过提供路径来加载数据,只分别提供年、月、日、额外字段\u名称的路径,但仍然只获取拼花地板文件本身中存在的列

作为一种解决方法,我在数据框本身中创建了一个名为-year_2、month_2、day_2和extra_field_name_2的重复列,作为year、month、day和extra_field_name的副本

在数据摄取阶段,我将数据帧划分为年、月、日和额外字段名称,并将其存储在S3中,S3在拼花文件本身中保留年、月、日和额外字段名称的列值

在执行数据操作时,我通过以下方式提供路径列表,在动态帧中加载数据:
['s3://path/to/source/data/year=2018/month=1/day=4/,'s3://path/to/source/data/year=2018/month=1/day=5/,'s3://path/to/source/data/year=2018/month=1/day=6/']


这给了我动态框架中的年、月、日和额外字段名,我可以进一步用于数据操作。

作为一种解决方法,我在数据框架本身中创建了一个名为年、月、日和额外字段名的重复列,作为年、月、日和额外字段名的副本

在数据摄取阶段,我将数据帧划分为年、月、日和额外字段名称,并将其存储在S3中,S3在拼花文件本身中保留年、月、日和额外字段名称的列值

在执行数据操作时,我通过以下方式提供路径列表,在动态帧中加载数据:
['s3://path/to/source/data/year=2018/month=1/day=4/,'s3://path/to/source/data/year=2018/month=1/day=5/,'s3://path/to/source/data/year=2018/month=1/day=6/']


这在动态框架中为我提供了年、月、日和额外字段名,我可以进一步用于数据操作。

尝试将
基本路径
传递到
连接选项
参数:

glueContext.create\u dynamic\u frame\u from\u options(
连接类型=“s3”,
连接\u选项={
“路径”:路径列表,
“递归”:正确,
“basePath”:“s3://path/to/source/data/”
},
format=“parquet”).toDF().printSchema()
这样,分区发现将发现路径上方的分区。根据,这些选项将传递给Spark SQL数据源

编辑:鉴于您的实验表明它不起作用,您是否考虑过传递顶级目录并从中筛选感兴趣的日期?当过滤器被“下推”到文件系统时,读取器将只读取相关的配置单元分区

(glueContext.create\u dynamic\u frame\u from\u options(
连接类型=“s3”,
连接\u选项={
“路径”:[“s3://path/to/source/data/”],
“递归”:正确,
},
format=“拼花地板”)
.toDF()
.过滤器(
(列(“年度”)=2018年)
&&(列(“月份”)==1)
&&(第(4、6)段之间
).printSchema()

尝试将
基本路径
传递给
连接选项
参数:

glueContext.create\u dynamic\u frame\u from\u options(
连接类型=“s3”,
连接\u选项={
“路径”:路径列表,
“递归”:正确,
“basePath”:“s3://path/to/source/data/”
},
format=“parquet”).toDF().printSchema()
这样,分区发现将发现路径上方的分区。根据,这些选项将传递给Spark SQL数据源

编辑:假设您的实验表明它不起作用,您是否考虑过传递顶级目录并从那里筛选感兴趣的日期?读者将只读取相关的配置单元分区,因为过滤器被“向下推”到文件系统

(glueContext.create\u dynamic\u frame\u from\u options(
连接类型=“s3”,
连接\u选项={
“路径”:[“s3://path/to/source/data/”],
“递归”:正确,
},
format=“拼花地板”)
.toDF()
.过滤器(
(列(“年度”)=2018年)
&&(列(“月份”)==1)
&&(第(4、6)段之间
).printSchema()

我可以通过另一个步骤来实现这一点,即让爬虫程序对S3上的目录进行爬网,然后使用Glue Catalog中的表作为Glue ETL的源

一旦在位置s3://path/to/source/data/上有了爬虫程序,年、月和日将自动被视为分区列

data_dyf = glueContext.create_dynamic_frame.from_catalog(
  database = db_name,   
  table_name = tbl_name, 
  push_down_predicate="(year=='2018' and month=='05')"
)

您可以找到更多详细信息

我可以通过添加