2017-07-31 7 views
0

を使用してデータフレームをフィルタリング:PySpark:私は次のサンプルDATAFRAME持っ条件

このDATAFRAME考える
l = [('Alice went to wonderland',), ('qwertyuiopqwert some text',), ('hello world',), ('ThisGetsFilteredToo',)] 
df = spark.createDataFrame(l) 


| Alice went to wonderland | 
| qwertyuiopqwert some text | 
| hello world    | 
| ThisGetsFilteredToo  | 

を、私は> 15文字の長さを有していても一つの単語を含む行をフィルタします。この例では、2行目に「qwertyuiopqwert」という単語の長さが15より大きいため、ドロップされます。 同様に、行4もドロップする必要があります。

答えて

0
from pyspark.sql.functions import udf,col 
from pyspark.sql.types import StringType, IntegerType, ArrayType 
data = ['athshgthsc asl','sdf sdfdsadf sdf', 'arasdfa sdf','aa bb','aaa bbb ccc','dd aa bbb'] 
df = sqlContext.createDataFrame(data,StringType()) 

def getLenghts(lst): 
    tempLst = [] 
    for ele in lst: 
     tempLst.append(len(ele)) 
    return tempLst 

getList = udf(lambda data:data.split(),StringType()) 
getListLen = udf(getLenghts,ArrayType(IntegerType())) 
getMaxLen = udf(lambda data:max(data),IntegerType()) 

df = (df.withColumn('splitWords',getList(df.value)) 
     .withColumn('lengthList',getListLen(col('splitWords'))) 
     .withColumn('maxLen',getMaxLen('lengthList'))) 
df.filter(df.maxLen<5).select('value').show() 




+----------------+ 
|   value| 
+----------------+ 
| athshgthsc asl| 
|sdf sdfdsadf sdf| 
|  arasdfa sdf| 
|   aa bb| 
|  aaa bbb ccc| 
|  dd aa bbb| 
+----------------+ 

+----------------+--------------------+----------+------+ 
|   value|   splitWords|lengthList|maxLen| 
+----------------+--------------------+----------+------+ 
| athshgthsc asl| [athshgthsc, asl]| [10, 3]| 10| 
|sdf sdfdsadf sdf|[sdf, sdfdsadf, sdf]| [3, 8, 3]|  8| 
|  arasdfa sdf|  [arasdfa, sdf]| [7, 3]|  7| 
|   aa bb|   [aa, bb]| [2, 2]|  2| 
|  aaa bbb ccc|  [aaa, bbb, ccc]| [3, 3, 3]|  3| 
|  dd aa bbb|  [dd, aa, bbb]| [2, 2, 3]|  3| 
+----------------+--------------------+----------+------+ 

+-----------+ 
|  value| 
+-----------+ 
|  aa bb| 
|aaa bbb ccc| 
| dd aa bbb| 
+-----------+ 

長さを15に保つように変更することもできます。データセットを分割する前に、さらに多くの前処理を実行できます。私のために、私はフィルターをかけて長さ> 5を保ってきました。

0

前の答えは正しいようですが、単純なユーザー定義関数でこれを行うことができます。文字列を分割し、長さ> 15で任意の単語を見つけるために、関数を作成します:

def no_long_words(s): 
    for word in s.split(): 
     if len(word) > 15: 
      return False 
    return True 

は、UDFを作成します。

from pyspark.sql.types import BooleanType 
no_long_words_udf = udf(no_long_words, BooleanType()) 

は、UDFを使用してデータフレームにフィルタを実行します。

df2 = df.filter(no_long_words_udf('col1')) 
df2.show() 

+--------------------+ 
|    col1| 
+--------------------+ 
|Alice went to won...| 
|qwertyuiopqwert s...| 
|   hello world| 
+--------------------+ 

注:qwertyuiopqwertは実際には15文字なので、結果に含まれます。

関連する問題