2017-11-06 2 views
-1

저는 파이썬 문자열 분할 방법으로 할 수있는 것처럼 n 번 스파크 데이터 프레임을 분할하는 방법을 찾고 있습니다.PySpark : df 프레임을 n 번 분할하십시오

각 파일의 로그 파일은 11million + lines입니다. 필요한 공간이있는 다른 데이터를 가지고 있기 때문에 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} 

I는 팬더 DF로 전환하지만, 메모리 소비가 문제가 될 것입니다 생각했습니다

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} 

구인 출력. 나는 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))