python—解析大型xml和生成配置单元表的最有效方法是什么?

rt4zxlrg  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(333)

我试图解析一个由科学家生成的非常大的xml文件,生成一组字段值,我将从xml中提取这些字段值,将结果存储在s3中,然后基于这些字段值生成一个配置单元表。
xml非常大——比如说,大约100万行,大约300万行文本。但格式是可预测的,如下所示:

<Butterfly>
    <Name>Swallowtail&</Name>
    <HomePage>https://example.com/butterflies/swallowtail/</HomePage>
    <TaxonomyID>54321</TaxonomyID>
    <Grouping>Papilionidae</Grouping>
</Butterfly>

假设每只蝴蝶都是一行,每个孩子都是我table上的一个区域。我使用python生成字段值并用'\t'分隔它们。使用xml.etree.elementtree,我从上到下解析每一行,使用类似于:text\u value=re.sub('\s+','',field.text).rstrip()的方法去除数据中的空白和制表符
然后,我将字段值的大字符串转储到s3,最后一步是:

CREATE EXTERNAL TABLE IF NOT EXISTS butterflies (
Name STRING,
HomePage STRING,
TaxonomyID BIGINT,
Grouping STRING,
ROW FORMAT DELIMITED
FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE
LOCATION 's3://butterflies/test_parsed_xml/';

python步骤非常低效,而且需要很长时间。一定有更聪明的方法!有什么建议吗?而且,数据库没有逻辑分区。
我试着用python生成一个大的字段值字符串,然后将其推送到s3。有没有更聪明或更好的方法来做到这一点?

field_values = ''
    row_count = 0
    for row in self.root_node:
        field_count = 0
        for field in row:
            if field.tag in self.schema[field_count]:
                if field.text:
                    text_value = re.sub('\s+', ' ', field.text).rstrip()
                else:
                    text_value = u''
                field_values = (field_values + text_value + '\t')
                field_count += 1
            else:
                raise ValueError()

        field_values = field_values + '\n'
        row_count += 1
        print("Processed row number {}".format(row_count))
    # Finally, code which pushes the huge string to s3
ryevplcw

ryevplcw1#

是的,有一个简单的方法可用,有第三方serde解析xml文件并在hdfs中存储为配置单元表。
问题是,您的xml文件不是有效的xml文件。你需要移除 & 确保所有标签都已关闭。即 HomePage 参考文献:
https://github.com/dvasilen/hive-xml-serde/wiki/xml-data-sources
从那里下载最新的jar。https://search.maven.org/search?q=hivexmlserde
将jar移到hdfs目录中 hdfs dfs -put hivexmlserde-1.0.5.3.jar 加载jar文件 add jar hivexmlserde-1.0.5.3.jar 确保使用 list jars; 如果你能看到jar,那么你已经做了正确的事情,否则你会错过一些东西。
现在,使用上面的serde创建表,如下所述。

CREATE EXTERNAL TABLE IF NOT EXISTS butterflies (
Name STRING,
HomePage STRING,
TaxonomyID BIGINT,
`Grouping` STRING)
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe'
WITH SERDEPROPERTIES (
"column.xpath.Name"="/Butterfly/Name/text()",
"column.xpath.HomePage"="/Butterfly/HomePage/text()",
"column.xpath.TaxonomyID"="/Butterfly/TaxonomyID/text()",
"column.xpath.Grouping"="/Butterfly/Grouping/text()"
)

STORED AS
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'

location '/tmp/test_xml/table/'
TBLPROPERTIES (
"xmlinput.start"="<Butterfly",
"xmlinput.end"="</Butterfly>"
);

在此之后,将xml文件移动到 /tmp/test_xml/table/ 位置。

相关问题