Python 3.x 如何将部分包含json字符串的文本日志转换为pyspark中的结构化日志?
我试图从非结构化日志创建一个数据框架,其中部分包含jsonPython 3.x 如何将部分包含json字符串的文本日志转换为pyspark中的结构化日志?,python-3.x,apache-spark,pyspark,apache-spark-sql,rdd,Python 3.x,Apache Spark,Pyspark,Apache Spark Sql,Rdd,我试图从非结构化日志创建一个数据框架,其中部分包含json 2020-09-24T08:03:01.633Z 10.1.20.1 {"EventTime":"2020-09-24 13:33:01","sourcename":"local","Keys":-9serverkey,"Type":"status"} 2020-09-24T08:03:01.633
2020-09-24T08:03:01.633Z 10.1.20.1 {"EventTime":"2020-09-24 13:33:01","sourcename":"local","Keys":-9serverkey,"Type":"status"}
2020-09-24T08:03:01.633Z 10.1.20.1 {"EventTime":"2020-09-24 13:34:01","sourcename":"local","Keys":-9serverkey,"Type":"status"}
2020-09-24T08:03:01.633Z 10.1.20.1 {"EventTime":"2020-09-24 13:35:01","sourcename":"local","Keys":-9serverkey,"Type":"status"}
这是我试过的
rdd = session.sparkContext.textFile("F:\\mypath\\rdd_test_log.txt")
dataFrame = rdd.map(lambda data: Row(time= data.split(" ")[0],
ip= data.split(" ")[1],
EventTime=data.split(":")[2])).toDF()
结果是
---------+------------------------+
|EventTime |ip |time |
+------------------------------+---------+------------------------+
|01.633Z 10.1.20.1 {"EventTime"|10.1.20.1|2020-09-24T08:03:01.633Z|
|01.633Z 10.1.20.1 {"EventTime"|10.1.20.1|2020-09-24T08:03:01.633Z|
|01.633Z 10.1.20.1 {"EventTime"|10.1.20.1|2020-09-24T08:03:01.633Z|
+------------------------------+---------+------------------------+
预期:
那么,如何将这个json字符串解析为rdd呢?或者应该采取什么方法
谢谢你的帮助
谢谢您可以使用字符串上的find“{”来获取一个索引,从中可以获得JSON文本的子字符串,然后解析该JSON
数据帧=
rdd.maplambda l:l.split,l
地图
lambda数据:行
时间=数据[0][0],ip=数据[0][1],事件时间=数据[1][数据[1]。查找{:]
托夫先生
选择
时间
知识产权,
f、 regexp_replacef.colEventTime,'键:..*,'键:$1',别名
活动时间
,
dataFrame.show1,False
显示
然后,您可以将EventTime解析为一个映射,该映射可以进一步扩展为多个列:
parsed=dataFrame.select
时间
知识产权,
f、 来自_json
活动时间,
结构类型
[
StructFieldEventTime,StringType,
StructFieldsourcename,StringType,
StructFieldKey,StringType,
StructFieldType,StringType,
]
,
。详情,
现在从地图中创建单独的列
解析=
已解析.withColumneventtime,已解析[eventdetails].getItemEventTime
.withColumnsourcename,已解析[eventdetails]。getItemsourcename
.withColumnKeys,已解析[eventdetails]。getItemKeys
.withColumnType,已解析[eventdetails]。getItemType
.DropEvent详细信息
解析显示
其中:
+--------------------+---------+-------------------+----------+-----------+------+
| time| ip| eventtime|sourcename| Keys| Type|
+--------------------+---------+-------------------+----------+-----------+------+
|2020-09-24T08:03:...|10.1.20.1|2020-09-24 13:33:01| local|-9serverkey|status|
|2020-09-24T08:03:...|10.1.20.1|2020-09-24 13:34:01| local|-9serverkey|status|
|2020-09-24T08:03:...|10.1.20.1|2020-09-24 13:35:01| local|-9serverkey|status|
+--------------------+---------+-------------------+----------+-----------+------+
请注意,我假设您的JSON是有效的。Keys:-9serverkey是无效的键/值对,因此我将您的数据编辑为Keys:-9serverkey将您的RDD替换为数据帧,并使用文本获取您的文件: df=spark.read.textF:\\mypath\\rdd\u test\u log.txt df.show +----------+ |价值观| +----------+ |2020-09-24T08:03:| |2020-09-24T08:03:| |2020-09-24T08:03:| +----------+ 然后分割json并将其保留为文本 版本号>=3 从pyspark.sql导入函数为F df=df.withColumnvalues,F.splitF.colvalue,,limit=3.select F.colvalues.getItem0.aliastime, F.colvalues.getItem1.aliasIP, F.colvalues.getItem2.aliasJSON, 或
版本spark首先要做的事。使用dataframe:spark.read.text。然后,将其拆分为3列,1列带有时间戳,1列带有IP,1列带有JSON。您可以使用该函数并使用limit选项限制拆分次数。然后,应用该函数。{EventTime:2020-09-24 13:33:01,sourcename:local,Keys:-9serverkey,Type:status}无效的JSON。这是一个输入错误吗?不@Steven..这不是一个输入错误..日志按原样显示..Keys:-9serverkey..是否有任何内置的spark sql函数可转换为有效的JSON字符串..@Adhi ernest_k和我的答案非常相似。我认为他们应该解决您当前的问题,只需选择您喜欢的一个。嗨Steven..我在这里g仅返回JSON列{EventTime:2020-09-24不是其他键….它没有返回完整的JSON列值..@Adhi您是否错过了*?JSON.*双引号JSON点星双引号。嗨@Steven..我没有错过所看到的任何内容..df.selecttime,IP,JSON.*.showdf.count,falshi@Steven..我还注意到JSON字符串不是Web服务器日志中显示的有效字符串。。。将字符串显示为键:-9serverkey如果这是您的真实数据,则您不能使用此方法。您需要首先清理数据。您好@ernest..json字符串中存在问题,您已通知它无效..它显示为键:-9serverkey..因此json返回null的原因是无效的..有正则表达式可以告诉我们吗我尝试了python正则表达式re.subr'\n\s*\s+\s*:',r'\n\1:',来自另一个函数的数据,但它返回错误异常:似乎您正试图从广播变量、操作或转换引用SparkContext。@Adhi使用使用regexp\u清除数据的步骤进行编辑@Steven..还有ernest..问题解决了。。
+------------------------+---------+---------------------------------------------------------------------------------------------+
|time |ip |EventTime |
+------------------------+---------+---------------------------------------------------------------------------------------------+
|2020-09-24T08:03:01.633Z|10.1.20.1|{"EventTime":"2020-09-24 13:33:01","sourcename":"local","Keys":"-9serverkey","Type":"status"}|
+------------------------+---------+---------------------------------------------------------------------------------------------+
+--------------------+---------+-------------------+----------+-----------+------+
| time| ip| eventtime|sourcename| Keys| Type|
+--------------------+---------+-------------------+----------+-----------+------+
|2020-09-24T08:03:...|10.1.20.1|2020-09-24 13:33:01| local|-9serverkey|status|
|2020-09-24T08:03:...|10.1.20.1|2020-09-24 13:34:01| local|-9serverkey|status|
|2020-09-24T08:03:...|10.1.20.1|2020-09-24 13:35:01| local|-9serverkey|status|
+--------------------+---------+-------------------+----------+-----------+------+