Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将部分包含json字符串的文本日志转换为pyspark中的结构化日志?_Python 3.x_Apache Spark_Pyspark_Apache Spark Sql_Rdd - Fatal编程技术网

Python 3.x 如何将部分包含json字符串的文本日志转换为pyspark中的结构化日志?

Python 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

我试图从非结构化日志创建一个数据框架,其中部分包含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|
+------------------------------+---------+------------------------+
预期: 那么,如何将这个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|
+--------------------+---------+-------------------+----------+-----------+------+