PySpark:拆分一个 df 帧 n 次



我正在寻找一种方法来拆分 Spark 数据帧 n 次,就像您可以使用 pythons 字符串拆分方法所做的那样。

我有一个日志文件,每个文件有1100万+行。我需要在" "(空格)上精确地拆分 df 3 次,因为我还有其他数据需要空格,因此使用数据帧拆分会造成混乱;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}

我考虑过变成熊猫DF,但内存消耗将是一个问题。我试图避免必须rdd.map.collect(),然后使用python字符串方法拆分并变回数据帧,因为它是大量的开销。

这可以通过在\s(?![^\{]*\})上拆分而不是简单地在空间上来解决。例如:

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))

相关内容

  • 没有找到相关文章

最新更新