2017-11-01 18 views
2

私は数億のレコードを持つ大きなデータフレームを持っています。私はdfの10%しか必要としないので、dfを読んでいる間にdfをフィルタリングしています。フィルタ条件は動的で、ある実験から別の実験に変化します。[]形式のリストを()形式に変換する方法

私はフィルタの値を取得しています、そこから別のDFがあります:

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

上記のスニペットは、リストが表示されますが、私は大きなファイルを読み込むには、以下のクエリを使用しています[1]

例えば言います:

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

タプルが1つの以上の要素を持っている場合、クエリが正常に動作しますが、フィルタ条件のみが1の値を持つときにタプルが(として出てきます1)又は(10293)等とフィルタ条件が

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

ことが出てくるので、大きなDFを読みながら、これはエラーの原因リストを変換する方法はあります[1](1)〜フォーマット。ありがとう

答えて

2

括弧で囲まれた1つの要素が角括弧でのみ解析され、1つの項目タプルを作成するにはカンマが必要です。

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

をまたやって:

カスタム文字列化の方法を行うことによってこの問題を解決することができます

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

おかげで多くのことを。あなたのアプローチは機能します。ヘルプをよろしくお願いいたします。 – Yuvaraj

関連する問題