使用AWS Glue编目嵌套XML

时间:2018-03-18 14:25:45

标签: xml aws-glue

我有XML源代码,我正在尝试使用Glue进行编目:

    <?xml version="1.0"?>
    <catalog>
       <book id="bk101">
          <title>XML Developer's Guide</title>
          <genre>Computer</genre>
          <price>44.95</price>
          <publish_date>2000-10-01</publish_date>
          <description>An in-depth look at creating applications with XML.</description>
          <authors>
            <author>
              <name>Gambardella, Matthew</name>
            </author>
          </authors>
       </book>
       ...

书籍条目正好被选中,但如何配置我的抓取工具/分类器来识别<authors>下的嵌套?

2 个答案:

答案 0 :(得分:0)

除非您希望它仅捕获该行标记,否则您不需要指定分类器。那么你只想将分类器设置为author。但是,您将无法获得其余数据。

如果您使用爬虫来推断数据的架构。它将捕获作者作为结构类型的内容。见下图:

Table schema following crawler with no classifier

现在您可以在粘贴作业中映射字段:

Mappings

或者只是在作业代码中访问字段本身,如下所示:

Accessing the field itself

答案 1 :(得分:0)

我们在将嵌套的XML数据加载到DynamicFrame时遇到了很多麻烦。问题是您不能使用标准Spark(在我们的情况下为PySpark)XPATH Hive DDL语句来加载DataFrame(在AWS GLUE的情况下为DynamicFrame)。 我们的解决方案是仅使用表格属性中的天真且仅DynamicFrame参数加载RowTag(不在 Serde参数中作为抓取工具)建议)。这将为您提供一个dynamicRecord['MySingleParsedField'],然后您可以在其中一个Spark(GLUE)作业中进行迭代以填充新字段。这里有一个这样的迭代代码的工作示例:

def Map_Inital_Fields(dynamicRecord):
    nested = []
    for item in dynamicRecord['MySingleParsedField']:
      nested.append(item)
    dynamicRecord['title'] = [item.get('title') for item in nested[0].get('book')][0]
    dynamicRecord['price'] = [item.get('price') for item in nested[0].get('book')][0]
    del dynamicRecord['MySingleParsedField']

    return dynamicRecord
mapfields01 = Map.apply(frame = selectfields2, f = Map_Inital_Fields, transformation_ctx = "mapfields01")

这只是一个例子,但基本上,一旦你将xml解析对象作为DynamicFrame中的一个字段,你就可以把它想象成一个Python对象(一个dic),然后根据需要进行修改。