Sparksql 多条件过滤(使用 where 子句的选择)
你好,我遇到了以下问题:
numeric.registerTempTable("numeric").
我想要过滤的所有值都是字面上的空字符串,而不是N/A或空值。
我尝试了这三种方法:
numeric_filtered = numeric.filter(numeric['LOW'] != 'null').filter(numeric['HIGH'] != 'null').filter(numeric['NORMAL'] != 'null')
numeric_filtered = numeric.filter(numeric['LOW'] != 'null' AND numeric['HIGH'] != 'null' AND numeric['NORMAL'] != 'null')
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 个回答
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这就像是把水从一个杯子倒到另一个杯子一样。
有些时候,我们会遇到一些问题,比如数据格式不对,或者数据不完整。这就像是你想把水倒到一个有洞的杯子里,水会漏出来,最后你可能会发现杯子里根本没有水了。
为了避免这些问题,我们可以使用一些工具或者方法来检查数据,确保它们是正确的。就像在倒水之前,先检查一下杯子有没有洞,确保水能顺利倒进去。
总之,处理数据的时候,要小心谨慎,确保每一步都能顺利进行,这样才能得到我们想要的结果。
from pyspark.sql.functions import col, countDistinct
totalrecordcount = df.where("ColumnName is not null").select(countDistinct("ColumnName")).collect()[0][0]
你正在使用逻辑与(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 子句中的多个条件