我试图从非结构化日志创建一个Dataframe,其中部分包含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.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|
+------------------------------+---------+------------------------+
期望值:
time |ip |eventtime |sourcename|Keys |Type
2020-09-24T08:03:01.633Z |10.1.20.1 |2020-09-24 13:33:01|local |-9serverkey |status
那么如何将这个json字符串解析为rdd呢?或者应该采取什么方法?
谢谢你的帮助。。
谢谢
2条答案
按热度按时间xfyts7mz1#
你可以用
find('{')
在字符串上选取一个索引,从中可以获得json文本的子字符串,然后解析该json。显示
然后你就可以解析了
EventTime
可以进一步展开为许多列的Map:现在从Map中创建单独的列
它给出:
注意,我假设您的json是有效的。
"Keys":-9serverkey
是无效的键/值对,因此我将您的数据编辑为"Keys":"-9serverkey"
l5tcr1uw2#
用Dataframe替换rdd并使用
text
要获取您的文件:然后分割json并将其保留为文本。
修复json的步骤
然后您只需将json字符串转换为结构类型。