PySpark RDD - 提取单个字段并以纯文本格式存储到HDFS

时间:2017-11-08 00:53:14

标签: json apache-spark elasticsearch pyspark

我正在从PySpark查询Elasticsearch集群(使用ES-Hadoop连接器。我的查询按预期工作(我认为)。基本上我要做的是查询我们的syslog索引,比如说,最后14个几天,得到消息并将它们写入HDFS中的文本。我将使用该文件在我的机器学习方面训练模型。

我们所有的代码都在Python中 - 用于临时测试,现在我正在使用PySpark(Spark 2.1.1)和Pythong 2.7.5。

我有查询Elastic工作只给我回消息,这是我想要的,但查询回来看起来像:

[(u'AV8Tfpi-37tcXZuJd_88', {u'message': u'NET: Unregistered protocol family 36'}), (u'AV8TfrTZ37tcXZuJeALS', {u'message': u'NET: Unregistered protocol family 36'}), (u'AV8Tfrdm37tcXZuJeANA', {u'message': u'DHCPACK to 10.42.44.223 (10:0b:a9:b1:c0:94) via eth2'}), (u'AV8TfrdlHGE25JoGXLyh', {u'message': u'DHCPINFORM from 10.7.35.184 via 10.7.35.254'}), (u'AV8TfrtH37tcXZuJeAOB', {u'message': u'DHCPINFORM from 10.7.23.219 via 10.7.23.254'}), (u'AV8Tfr-T37tcXZuJeAQK', {u'message': u'DHCPINFORM from 10.42.62.156 via 10.42.63.252'}), (u'AV8TfsDkHGE25JoGXL09', {u'message': u'publish.go:104: Events sent: 157'}), (u'AV8Tfsoi37tcXZuJeAXB', {u'message': u'NET: Registered protocol family 36'}), (u'AV8TftjdHGE25JoGXMES', {u'message': u'DHCPDISCOVER from 00:24:7e:03:f1:23 via 10.7.8.254 : peer holds all free leases'}), (u'AV8Tfttu37tcXZuJeAhK', {u'message': u'NET: Unregistered protocol family 36'})]

这只是一个10记录的样本。 ES的整个索引是巨大的。我的目标是获取这些消息,例如在第一个记录中," NET:未注册的协议族36"并将它们写成纯文本(每条消息都在它自己的行上)所以在一天结束时,我在HDFS中只有14个文本文件,只有代表来自syslog的那14天消息的消息。

之后,我想做同样的事情,但将消息,时间戳和主机名作为CSV文件。

现在,我的问题 - 我如何使用Python / PySpark来获取Elastic返回给我的内容,并创建一个仅包含这些字段的文本文件。它回归JSON,我明白了。我不知道第一个身份证号码是什么,但看起来它来自ES。我是Python的新手,不知道如何解析这个返回。它看起来像是一个JSON对象的列表,但对于Python来说是新手,我不确定。

这不需要成为一个经常工作的工作,我真的,我只是想这样做以获取ES的历史数据,因为它拥有30天的数据。对于未来的状态,我只是从我们的Kafka集群中抓取东西并在摄取和排队时将其输入。现在,我只需要弄清楚如何解析和格式化ES返回给我的内容。任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

你的意思是这样的吗?

spark.version
# u'2.1.1'
jsonRDD = sc.parallelize([(u'AV8Tfpi-37tcXZuJd_88', {u'message': u'NET: Unregistered protocol family 36'}), (u'AV8TfrTZ37tcXZuJeALS', {u'message': u'NET: Unregistered protocol family 36'}), (u'AV8Tfrdm37tcXZuJeANA', {u'message': u'DHCPACK to 10.42.44.223 (10:0b:a9:b1:c0:94) via eth2'}), (u'AV8TfrdlHGE25JoGXLyh', {u'message': u'DHCPINFORM from 10.7.35.184 via 10.7.35.254'}), (u'AV8TfrtH37tcXZuJeAOB', {u'message': u'DHCPINFORM from 10.7.23.219 via 10.7.23.254'}), (u'AV8Tfr-T37tcXZuJeAQK', {u'message': u'DHCPINFORM from 10.42.62.156 via 10.42.63.252'}), (u'AV8TfsDkHGE25JoGXL09', {u'message': u'publish.go:104: Events sent: 157'}), (u'AV8Tfsoi37tcXZuJeAXB', {u'message': u'NET: Registered protocol family 36'}), (u'AV8TftjdHGE25JoGXMES', {u'message': u'DHCPDISCOVER from 00:24:7e:03:f1:23 via 10.7.8.254 : peer holds all free leases'}), (u'AV8Tfttu37tcXZuJeAhK', {u'message': u'NET: Unregistered protocol family 36'})])

jsonRDD2 = jsonRDD.map(lambda x: x[1]['message'])

# for inspection purposes only:
jsonRDD2.collect()
# [u'NET: Unregistered protocol family 36', 
#  u'NET: Unregistered protocol family 36',
#  u'DHCPACK to 10.42.44.223 (10:0b:a9:b1:c0:94) via eth2',
#  u'DHCPINFORM from 10.7.35.184 via 10.7.35.254',
#  u'DHCPINFORM from 10.7.23.219 via 10.7.23.254',
#  u'DHCPINFORM from 10.42.62.156 via 10.42.63.252',
#  u'publish.go:104: Events sent: 157', 
#  u'NET: Registered protocol family 36',
#  u'DHCPDISCOVER from 00:24:7e:03:f1:23 via 10.7.8.254 : peer holds all free leases', 
#  u'NET: Unregistered protocol family 36']

jsonRDD2.saveAsTextFile("path/to/file")