PySpark:将 df 帧拆分 n 次
PySpark: Split a df frame n times
我正在寻找一种将 spark 数据帧拆分 n 次的方法,就像您可以使用 pythons 字符串拆分方法一样。
我有一个日志文件,每个文件都有 1100 万多行。我需要在“”(space)上将 df 精确拆分 3 次,因为我有其他数据需要 space,因此使用数据帧拆分会造成混乱; request.useragent 是分裂的原因。
2017-09-24T00:17:01+00:00 dev-lb01 proxy[49]: {"backend_connect_time_ms":0,"request.useragent":"Mozilla\/5.0 (Linux; Android 5.1; ASUS_Z00VD Build\/LMY47I; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/43.0.235","resp.code":304,"retries_count":0,"session_duration_ms":979,"srv_conn_count":31,"srv_queue_count":0,"termination_state":"--","timestamp":1506212220}
想要输出
date host app json
2017-09-24T00:17:01+00:00 | dev-lb01 | proxy[49]: | {"backend_connect_time_ms":0,"request.useragent":"Mozilla\/5.0 (Linux; Android 5.1; ASUS_Z00VD Build\/LMY47I; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/43.0.235","resp.code":304,"retries_count":0,"session_duration_ms":979,"srv_conn_count":31,"srv_queue_count":0,"termination_state":"--","timestamp":1506212220}
我考虑过变成 Pandas DF,但内存消耗将成为一个问题。我试图避免必须 rdd.map.collect() 然后使用 python 字符串方法拆分并返回到数据帧,因为它会产生大量开销。
这可以通过拆分 \s(?![^\{]*\})
而不是简单地拆分 space 来解决。例如:
split_col = pyspark.sql.functions.split(df['my_str_col'], '\s(?![^\{]*\})')
df = df.withColumn('date', split_col.getItem(0))
.withColumn('host', split_col.getItem(1))
.withColumn('app', split_col.getItem(2))
.withColumn('json', split_col.getItem(3))
我正在寻找一种将 spark 数据帧拆分 n 次的方法,就像您可以使用 pythons 字符串拆分方法一样。
我有一个日志文件,每个文件都有 1100 万多行。我需要在“”(space)上将 df 精确拆分 3 次,因为我有其他数据需要 space,因此使用数据帧拆分会造成混乱; request.useragent 是分裂的原因。
2017-09-24T00:17:01+00:00 dev-lb01 proxy[49]: {"backend_connect_time_ms":0,"request.useragent":"Mozilla\/5.0 (Linux; Android 5.1; ASUS_Z00VD Build\/LMY47I; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/43.0.235","resp.code":304,"retries_count":0,"session_duration_ms":979,"srv_conn_count":31,"srv_queue_count":0,"termination_state":"--","timestamp":1506212220}
想要输出
date host app json
2017-09-24T00:17:01+00:00 | dev-lb01 | proxy[49]: | {"backend_connect_time_ms":0,"request.useragent":"Mozilla\/5.0 (Linux; Android 5.1; ASUS_Z00VD Build\/LMY47I; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/43.0.235","resp.code":304,"retries_count":0,"session_duration_ms":979,"srv_conn_count":31,"srv_queue_count":0,"termination_state":"--","timestamp":1506212220}
我考虑过变成 Pandas DF,但内存消耗将成为一个问题。我试图避免必须 rdd.map.collect() 然后使用 python 字符串方法拆分并返回到数据帧,因为它会产生大量开销。
这可以通过拆分 \s(?![^\{]*\})
而不是简单地拆分 space 来解决。例如:
split_col = pyspark.sql.functions.split(df['my_str_col'], '\s(?![^\{]*\})')
df = df.withColumn('date', split_col.getItem(0))
.withColumn('host', split_col.getItem(1))
.withColumn('app', split_col.getItem(2))
.withColumn('json', split_col.getItem(3))