Sparksql 多条件过滤(使用 where 子句的选择)

17 投票
2 回答
67843 浏览
提问于 2025-05-10 10:01

你好,我遇到了以下问题:

numeric.registerTempTable("numeric"). 

我想要过滤的所有值都是字面上的空字符串,而不是N/A或空值。

我尝试了这三种方法:

  1. numeric_filtered = numeric.filter(numeric['LOW'] != 'null').filter(numeric['HIGH'] != 'null').filter(numeric['NORMAL'] != 'null')

  2. numeric_filtered = numeric.filter(numeric['LOW'] != 'null' AND numeric['HIGH'] != 'null' AND numeric['NORMAL'] != 'null')

  3. sqlContext.sql("SELECT * from numeric WHERE LOW != 'null' AND HIGH != 'null' AND NORMAL != 'null'")

不幸的是,numeric_filtered总是为空。我检查过,numeric里面有数据应该符合这些条件。

这里有一些示例值:

低值 高值 正常值

3.5 5.0 null

2.0 14.0 null

null 38.0 null

null null null

1.0 null 4.0

相关文章:

  • 暂无相关问题
暂无标签

2 个回答

0

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这就像是把水从一个杯子倒到另一个杯子一样。

有些时候,我们会遇到一些问题,比如数据格式不对,或者数据不完整。这就像是你想把水倒到一个有洞的杯子里,水会漏出来,最后你可能会发现杯子里根本没有水了。

为了避免这些问题,我们可以使用一些工具或者方法来检查数据,确保它们是正确的。就像在倒水之前,先检查一下杯子有没有洞,确保水能顺利倒进去。

总之,处理数据的时候,要小心谨慎,确保每一步都能顺利进行,这样才能得到我们想要的结果。

from pyspark.sql.functions import col, countDistinct 
totalrecordcount = df.where("ColumnName is not null").select(countDistinct("ColumnName")).collect()[0][0]
29

你正在使用逻辑与(AND)。这意味着所有的列都必须不同于 'null',这样这一行才会被包含进来。我们可以用 filter 的例子来说明这一点:

numeric = sqlContext.createDataFrame([
    ('3.5,', '5.0', 'null'), ('2.0', '14.0', 'null'),  ('null', '38.0', 'null'),
    ('null', 'null', 'null'),  ('1.0', 'null', '4.0')],
    ('low', 'high', 'normal'))

numeric_filtered_1 = numeric.where(numeric['LOW'] != 'null')
numeric_filtered_1.show()

## +----+----+------+
## | low|high|normal|
## +----+----+------+
## |3.5,| 5.0|  null|
## | 2.0|14.0|  null|
## | 1.0|null|   4.0|
## +----+----+------+

numeric_filtered_2 = numeric_filtered_1.where(
    numeric_filtered_1['NORMAL'] != 'null')
numeric_filtered_2.show()

## +---+----+------+
## |low|high|normal|
## +---+----+------+
## |1.0|null|   4.0|
## +---+----+------+

numeric_filtered_3 = numeric_filtered_2.where(
    numeric_filtered_2['HIGH'] != 'null')
numeric_filtered_3.show()

## +---+----+------+
## |low|high|normal|
## +---+----+------+
## +---+----+------+

你尝试的所有其他方法都遵循完全相同的逻辑。你在这里需要的是逻辑或(OR)。

from pyspark.sql.functions import col 

numeric_filtered = df.where(
    (col('LOW')    != 'null') | 
    (col('NORMAL') != 'null') |
    (col('HIGH')   != 'null'))
numeric_filtered.show()

## +----+----+------+
## | low|high|normal|
## +----+----+------+
## |3.5,| 5.0|  null|
## | 2.0|14.0|  null|
## |null|38.0|  null|
## | 1.0|null|   4.0|
## +----+----+------+

或者用原始 SQL 来写:

numeric.registerTempTable("numeric")
sqlContext.sql("""SELECT * FROM numeric
    WHERE low != 'null' OR normal != 'null' OR high != 'null'"""
).show()

## +----+----+------+
## | low|high|normal|
## +----+----+------+
## |3.5,| 5.0|  null|
## | 2.0|14.0|  null|
## |null|38.0|  null|
## | 1.0|null|   4.0|
## +----+----+------+

另请参见: Pyspark:when 子句中的多个条件

撰写回答