我在Hadoop上有一个network.log
:
{"Source":"Network","Detail":"Event=01|Device=Mobile|ClientIP=10.0.0.0|URL=example.com"}
我想将其作为数据框加载Detail
与|
。然后我想使用=
进一步拆分每个新列,左侧部分作为列名称,右侧部分作为值。
预期结果将是:
Source | Event | Device | ClientIP | URL
Network | 01 | Mobile | 10.0.0.0 | example.com
我完成了第一次拆分,如下所示:
from pyspark import SparkContext
from pyspark.sql import functions, SQLContext
INPUT_PATH = 'network.log'
sc = SparkContext("local", "NetworkEvent")
sqlContext = SQLContext(sc)
raw = sqlContext.read.json(INPUT_PATH)
detail_col = functions.split(raw['Detail'], '\|')
for i in range(4):
raw = raw.withColumn('col_' + str(i), detail_col.getItem(i))
raw.show()
我的问题是,我可以在detail_col.getItem(i)
之上同时进行第二次拆分吗?我可以考虑为新数据框的每一列创建另一个UDF,但是在一个UDF中是否有更优雅的方式?非常感谢!
注意:我使用Spark 1.5.0,所以Pandas' UDF无法使用。