我试图解析一个由科学家生成的非常大的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
1条答案
按热度按时间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创建表,如下所述。
在此之后,将xml文件移动到
/tmp/test_xml/table/
位置。