当前位置: 首页 > 面试题库 >

使用列的长度过滤DataFrame

田硕
2023-03-14
问题内容

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

更具体的,我有一个DataFrame只有一个Column,其中ArrayType(StringType()),我想过滤DataFrame使用长度filterer,我拍下面的一个片段。

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的Documentation,但是没有找到任何有用的属性。感谢您的帮助!


问题答案:

在Spark> =
1.5中,您可以使用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]|
## +---------+

在Spark <1.5中,UDF应该可以解决问题:

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]|
## +---------+

如果您使用的HiveContextsizeUDF与原始的SQL应与任何版本:

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|
## +---+


 类似资料:
  • 问题内容: 我试图获取记录在“标题”中,然后是X个字符。 注意:并非所有记录都包含标题字段。 我努力了: 结果,我得到这个错误: 我该如何解决? 问题答案: 您需要考虑到某些文档可能具有空字段。因此,您可以使用常规的空安全运算符。另外,请确保改用POST方法:

  • 问题内容: 如何按字符串长度过滤? 此代码段: 给了我以下错误: 在哪里: 问题答案: 您需要使用SQL函数生成器来创建函数:

  • 问题内容: 在Java程序中,我有一个要基于特定属性过滤的bean列表。 例如,假设我有一个Person列表,一个JavaBean,其中Person具有许多属性,其中包括“名称”。 我也有一个名字列表。 现在,我想查找姓名在姓名列表中的所有人员。 使用Google Guava执行此过滤器的最佳方法是什么? 到目前为止,我已经考虑过将Guava与Apache beanutils结合使用,但这似乎并不

  • 问题内容: 我有一个csv文件,当我使用过滤列并使用多个索引时,该文件输入不正确。 我希望df1和df2除了丢失的虚拟列外应该相同,但这些列的标签错误。日期也被解析为日期。 使用列号而不是名称给我同样的问题。我可以通过在read_csv步骤之后删除虚拟列来解决此问题,但是我试图了解出了什么问题。我正在使用熊猫0.10.1。 编辑:修复错误的标头用法。 问题答案: @chip的答案完全错过了两个关键

  • 问题内容: 有没有什么好方法可以使用angular过滤列表而不使用ng- repeat?我不想首先使用javascript绘制列表,但是之后我想使用angular对其进行过滤。 例: 我想使用搜索框来过滤现有的html。 (一般请不要使用ng-repeat或jQuery给出任何示例) 问题答案: 您可以编写一个简单的指令来处理显示/隐藏: 并以这种方式使用它: 使用指令有两个好处: 1)。您不必在

  • 我有一个搜索栏,让用户过滤基于他们的条目使用角度。现在我希望能够在用户输入的搜索词与数组中的任何内容都不匹配时显示类似“Nothing match your search”的消息。 控制器 是否可以知道过滤数组的长度,以便我可以显示消息?