2017-11-01 7 views
2

나는 수 억 개의 레코드가있는 큰 데이터 프레임을 가지고 있습니다. 나는 단지 그것을 읽는 동안 df를 필터링 할 정도로 오직 df의 10 %만을 원한다. 필터 조건은 동적이며 한 실험에서 다른 실험으로 변경됩니다.[] 형식의 목록을() 형식으로 변환하는 방법

filter = "filter_condition in" + tuple(df1.select("xxx").rdd.flatMap(lambda x: x).collect()) 

위의 조각이 목록은 예를 들어 내가 큰 파일을 읽을 수 아래의 쿼리를 사용하고 [1]

말할 수 있습니다 :있는 내가 필터 값을 얻고 다른 DF가있다

: 튜플 1 개 이상의 요소가있는 경우

large_df = (sqlContext.read.parquet(path).filter(filter)) 

쿼리는 잘 작동하지만, 필터 조건은 1 값을 가질 때 다음 튜플로 나온다 (1) 또는 (10,293) 등을 필터 조건

(sqlContext.read.parquet(path).filter("filter_condition in (1,)")) 

나옵니다 때문에 큰 DF를 판독하는 동안이 오류가 발생리스트를 변환하는 방법이있다 [1] (1) 체재. 감사합니다

답변

2

대괄호로 묶인 하나의 요소가 대괄호로 구문 분석되므로 하나의 항목 튜플을 만들려면 콤마가 필요합니다.

def tuple_to_str(t): 
    t = tuple(t) 
    if len(t) == 1: 
     return '({!r})'.format(t[0]) 
    return repr(t) 

을 그리고 일 :

사용자 지정 stringifying 방법을함으로써이 문제를 해결할 수

filter = "filter_condition in" + tuple_to_str(
    df1.select("xxx").rdd.flatMap(lambda x: x).collect() 
) 
+0

덕분에 많이. 귀하의 접근 방식이 효과적입니다. 도움을 감사하십시오. – Yuvaraj