2015-11-13 6 views
15

मैं कॉलम की लंबाई से संबंधित स्थिति का उपयोग करके DataFrame फ़िल्टर करना चाहता हूं, यह प्रश्न बहुत आसान हो सकता है लेकिन मुझे SO में कोई संबंधित प्रश्न नहीं मिला।कॉलम की लंबाई का उपयोग कर डेटाफ्रेम फ़िल्टर करना

अधिक विशिष्ट, मैं केवल एक Column के साथ एक DataFrame जो ArrayType(StringType()) की, मैं filterer के रूप में लंबाई का उपयोग कर DataFrame फ़िल्टर करना चाहते हैं, मैं एक टुकड़ा नीचे गोली मार दी है।

df = sqlContext.read.parquet("letters.parquet") 
df.show() 

# The output will be 
# +------------+ 
# |  tokens| 
# +------------+ 
# |[L, S, Y, S]| 
# |[L, V, I, S]| 
# |[I, A, N, A]| 
# |[I, L, S, A]| 
# |[E, N, N, Y]| 
# |[E, I, M, A]| 
# |[O, A, N, A]| 
# | [S, U, S]| 
# +------------+ 

# But I want only the entries with length 3 or less 
fdf = df.filter(len(df.tokens) <= 3) 
fdf.show() # But it says that the TypeError: object of type 'Column' has no len(), so the previous statement is obviously incorrect. 

मैंने Column's Documentation पढ़ा, लेकिन इस मामले के लिए कोई भी संपत्ति उपयोगी नहीं मिली। मैं किसी भी मदद की सराहना करता हूं!

उत्तर

29

स्पार्क में> = 1.5 आप size फ़ंक्शन का उपयोग कर सकते हैं:

from pyspark.sql.types import IntegerType 
from pyspark.sql.functions import udf 

size_ = udf(lambda xs: len(xs), IntegerType()) 

df.where(size_(col("tokens")) <= 3).show() 

## +---------+ 
## | tokens| 
## +---------+ 
## |[S, U, S]| 
## +---------+ 

आप कच्चे एसक्यूएल साथ HiveContext तो size यूडीएफ का उपयोग करते हैं:

from pyspark.sql.functions import col, size 

df = sqlContext.createDataFrame([ 
    (["L", "S", "Y", "S"], ), 
    (["L", "V", "I", "S"], ), 
    (["I", "A", "N", "A"], ), 
    (["I", "L", "S", "A"], ), 
    (["E", "N", "N", "Y"], ), 
    (["E", "I", "M", "A"], ), 
    (["O", "A", "N", "A"], ), 
    (["S", "U", "S"], )], 
    ("tokens",)) 

df.where(size(col("tokens")) <= 3).show() 

## +---------+ 
## | tokens| 
## +---------+ 
## |[S, U, S]| 
## +---------+ 

स्पार्क < 1.5 में एक यूडीएफ चाल करना चाहिए किसी भी संस्करण के साथ काम करना चाहिए:

df.registerTempTable("df") 
sqlContext.sql("SELECT * FROM df WHERE size(tokens) <= 3").show() 

## +--------------------+ 
## |    tokens| 
## +--------------------+ 
## |ArrayBuffer(S, U, S)| 
## +--------------------+ 

स्ट्रिंग कॉलम आप उपयोग कर सकते हैं के लिए एक udf ऊपर परिभाषित या length समारोह:

from pyspark.sql.functions import length 

df = sqlContext.createDataFrame([("fooo",), ("bar",)], ("k",)) 
df.where(length(col("k")) <= 3).show() 

## +---+ 
## | k| 
## +---+ 
## |bar| 
## +---+ 
+2

क्या होगा यदि स्तंभ एक 'स्ट्रिंग' है और मैं' स्ट्रिंग' की दूरी के आधार पर फ़िल्टर करने के लिए बहाना के बारे में? –

+3

वही udf या 'लंबाई' फ़ंक्शन। – zero323

संबंधित मुद्दे