Python 使用列的长度筛选数据帧

Python 使用列的长度筛选数据帧,python,apache-spark,dataframe,pyspark,apache-spark-sql,Python,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,我想使用与列长度相关的条件过滤DataFrame,这个问题可能很简单,但我在SO中没有找到任何相关问题 更具体地说,我有一个DataFrame只有一个列其中的ArrayType(StringType()),我想用长度作为过滤器过滤DataFrame,我在下面截取了一个片段 df = sqlContext.read.parquet("letters.parquet") df.show() # The output will be # +------------+ # | tokens

我想使用与列长度相关的条件过滤
DataFrame
,这个问题可能很简单,但我在SO中没有找到任何相关问题

更具体地说,我有一个
DataFrame
只有一个
其中的
ArrayType(StringType())
,我想用长度作为过滤器过滤
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.
df=sqlContext.read.parquet(“letters.parquet”)
df.show()
#输出将是
# +------------+
#|代币|
# +------------+
#|[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]|
# +------------+
#但我只想要长度小于等于3的条目

fdf=df.filter(len(df.tokens)在Spark>=1.5中,您可以使用以下函数:

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]|
## +---------+
from pyspark.sql.functions import length

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

## +---+
## |  k|
## +---+
## |bar|
## +---+
对于字符串列,您可以使用上面定义的
udf
length
函数:

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]|
## +---------+
from pyspark.sql.functions import length

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

## +---+
## |  k|
## +---+
## |bar|
## +---+
从pyspark.sql.functions导入长度
df=sqlContext.createDataFrame([(“fooo”,),(“bar”,)],(“k”,))

df.where(length(col(“k”))这里是scala中字符串的一个示例:

val stringData = Seq(("Maheswara"), ("Mokshith"))
val df = sc.parallelize(stringData).toDF
df.where((length($"value")) <= 8).show
+--------+
|   value|
+--------+
|Mokshith|
+--------+
df.withColumn("length", length($"value")).show
+---------+------+
|    value|length|
+---------+------+
|Maheswara|     9|
| Mokshith|     8|
+---------+------+
val stringData=Seq((“Maheswara”),(“Mokshith”))
val df=sc.parallelize(stringData).toDF

df.where((长度($“值”)@AlbertoBonsanto:下面是基于数组大小的代码过滤器:

val input = Seq(("a1,a2,a3,a4,a5"), ("a1,a2,a3,a4"), ("a1,a2,a3"), ("a1,a2"), ("a1"))
val df = sc.parallelize(input).toDF("tokens")
val tokensArrayDf = df.withColumn("tokens", split($"tokens", ","))
tokensArrayDf.show
+--------------------+
|              tokens|
+--------------------+
|[a1, a2, a3, a4, a5]|
|    [a1, a2, a3, a4]|
|        [a1, a2, a3]|
|            [a1, a2]|
|                [a1]|
+--------------------+

tokensArrayDf.filter(size($"tokens") > 3).show
+--------------------+
|              tokens|
+--------------------+
|[a1, a2, a3, a4, a5]|
|    [a1, a2, a3, a4]|
+--------------------+

如果列是一个
字符串
,而我假装按
字符串
的长度进行过滤,那该怎么办?相同的udf或
长度
函数。我的问题与此不同,我指的是一个字符串数组的列。