有没有办法让胶水作业始终从 xml 读取数据作为字符串?
Is there a way to make glue job to always read data from xml as string?
我有这个 xml,我可以通过 AWS Glue 读取并插入到 RDS。下面是示例 xml.
<VENDOR>
<DETAILS>
<RECORD>
<VENDOR_NUMBER>123456D</VENDOR_NUMBER>
<VENDOR_NAME>STORE 1</VENDOR_NAME>
</RECORD>
<RECORD>
<VENDOR_NUMBER>123456</VENDOR_NUMBER>
<VENDOR_NAME>STORE 2</VENDOR_NAME>
</RECORD>
<RECORD>
<VENDOR_NUMBER>123456C</VENDOR_NUMBER>
<VENDOR_NAME>STORE 3</VENDOR_NAME>
</RECORD>
</DETAILS>
<TRAILER>
<TOTAL_RECORD>00003</TOTAL_RECORD>
</TRAILER>
</VENDOR>
出于某种原因,从 xml 创建的动态框架内的列始终是结构类型。下面是 printschema 结果和示例代码
datasource = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table_name", transformation_ctx = "datasource")
datasource.printSchema()
root
|-- VENDOR_NAME: string (nullable = true)
|-- VENDOR_NUMBER: struct (nullable = true)
| |-- double: double (nullable = true)
| |-- int: integer (nullable = true)
| |-- string: string (nullable = true)
我尝试添加一个解析选项将数据转换为字符串,它适用于 int 类型,但不适用于 double 类型,因为原始数据是 123456D,但它不知何故变成了双重 123456.0。以下是 RDS 中的示例脚本和结果。
resolvechoice = ResolveChoice.apply(frame = datasource, choice = "cast:string", transformation_ctx = "resolvechoice")
VENDOR_NUMBER VENDOR_NAME
123456.0 STORE 1
123456 STORE 2
123456G STORE 3
我还尝试更新数据目录中 table 的架构,将所有字段的数据类型更改为字符串,还在胶合爬虫配置选项中选择忽略架构更改的选项,但它没有用。以下来自爬虫选项
Configuration options
Schema updates in the data store Ignore the change and don't update the table in the data catalog.
Inherit schema from table Update all new and existing partitions with metadata from the table.
Object deletion in the data store Mark the table as deprecated in the data catalog.
有没有办法让胶水作业始终以字符串形式从 xml 读取数据?
AWS 论坛有人回答了我的问题。我在这里发布解决方案以防万一有人需要它。
我使用 spark-xml 生成 DataFrame 而不是 DynamicFrame。
df = spark.read.format('xml') \
.option("rowTag", "RECORD") \
.load("s3://bucket/glue/input-xml/")
df.printSchema()
df.show()
root
|-- VENDOR_NAME: string (nullable = true)
|-- VENDOR_NUMBER: string (nullable = true)
+-----------+-------------+
|VENDOR_NAME|VENDOR_NUMBER|
+-----------+-------------+
| STORE 1| 123456D|
| STORE 2| 123456|
| STORE 3| 123456C|
+-----------+-------------+
为此,您需要下载 spark-xml JAR 文件,将其上传到 S3,并将其添加到 Glue 作业的 'Dependent jars path' 中。
https://mvnrepository.com/artifact/com.databricks/spark-xml_2.11/0.7.0
https://docs.aws.amazon.com/en_pv/glue/latest/dg/add-job.html
我有这个 xml,我可以通过 AWS Glue 读取并插入到 RDS。下面是示例 xml.
<VENDOR>
<DETAILS>
<RECORD>
<VENDOR_NUMBER>123456D</VENDOR_NUMBER>
<VENDOR_NAME>STORE 1</VENDOR_NAME>
</RECORD>
<RECORD>
<VENDOR_NUMBER>123456</VENDOR_NUMBER>
<VENDOR_NAME>STORE 2</VENDOR_NAME>
</RECORD>
<RECORD>
<VENDOR_NUMBER>123456C</VENDOR_NUMBER>
<VENDOR_NAME>STORE 3</VENDOR_NAME>
</RECORD>
</DETAILS>
<TRAILER>
<TOTAL_RECORD>00003</TOTAL_RECORD>
</TRAILER>
</VENDOR>
出于某种原因,从 xml 创建的动态框架内的列始终是结构类型。下面是 printschema 结果和示例代码
datasource = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table_name", transformation_ctx = "datasource")
datasource.printSchema()
root
|-- VENDOR_NAME: string (nullable = true)
|-- VENDOR_NUMBER: struct (nullable = true)
| |-- double: double (nullable = true)
| |-- int: integer (nullable = true)
| |-- string: string (nullable = true)
我尝试添加一个解析选项将数据转换为字符串,它适用于 int 类型,但不适用于 double 类型,因为原始数据是 123456D,但它不知何故变成了双重 123456.0。以下是 RDS 中的示例脚本和结果。
resolvechoice = ResolveChoice.apply(frame = datasource, choice = "cast:string", transformation_ctx = "resolvechoice")
VENDOR_NUMBER VENDOR_NAME
123456.0 STORE 1
123456 STORE 2
123456G STORE 3
我还尝试更新数据目录中 table 的架构,将所有字段的数据类型更改为字符串,还在胶合爬虫配置选项中选择忽略架构更改的选项,但它没有用。以下来自爬虫选项
Configuration options
Schema updates in the data store Ignore the change and don't update the table in the data catalog.
Inherit schema from table Update all new and existing partitions with metadata from the table.
Object deletion in the data store Mark the table as deprecated in the data catalog.
有没有办法让胶水作业始终以字符串形式从 xml 读取数据?
AWS 论坛有人回答了我的问题。我在这里发布解决方案以防万一有人需要它。
我使用 spark-xml 生成 DataFrame 而不是 DynamicFrame。
df = spark.read.format('xml') \
.option("rowTag", "RECORD") \
.load("s3://bucket/glue/input-xml/")
df.printSchema()
df.show()
root
|-- VENDOR_NAME: string (nullable = true)
|-- VENDOR_NUMBER: string (nullable = true)
+-----------+-------------+
|VENDOR_NAME|VENDOR_NUMBER|
+-----------+-------------+
| STORE 1| 123456D|
| STORE 2| 123456|
| STORE 3| 123456C|
+-----------+-------------+
为此,您需要下载 spark-xml JAR 文件,将其上传到 S3,并将其添加到 Glue 作业的 'Dependent jars path' 中。 https://mvnrepository.com/artifact/com.databricks/spark-xml_2.11/0.7.0 https://docs.aws.amazon.com/en_pv/glue/latest/dg/add-job.html