2017-11-06 8 views
-1

私は、pythonsの文字列分割方法と同様にn回スパークデータフレームを分割する方法を探しています。PySpark:dfフレームをn回に分割する

私はログファイルごとに11百万回以上のファイルを持っています。私は必要なスペースを持つ他のデータを持っているので、データフレーム分割を使用すると混乱を招くので、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の文字列メソッドを使用してください。

答えて

1

これは、単にスペースの代わりに\\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)) 
関連する問題