Scala 如何在 sqlContext 查询中处理 isnull 或 ifnull
How does Scala handle isnull or ifnull in query with sqlContext
我有两个数据文件如下:
course.txt
id,course
1,Hadoop
2,Spark
3,HBase
5,Impala
Fee.txt
id,amount
2,3900
3,4200
4,2900
我需要列出所有课程信息及其费用:
sqlContext.sql("select c.id, c.course, f.amount from course c left outer join fee f on f.id = c.id").show
+---+------+------+
| id|course|amount|
+---+------+------+
| 1|Hadoop| null|
| 2| Spark|3900.0|
| 3| HBase|4200.0|
| 5|Impala| null|
+---+------+------+
如果课程未在费用中注明 table,那么我不想显示 null,而是显示 'N/A'。
我已经尝试了以下但还没有得到:
命令 1:
sqlContext.sql("select c.id, c.course, ifnull(f.amount, 'N/A') from course c left outer join fee f on f.id = c.id").show
错误:org.apache.spark.sql.AnalysisException:未定义函数 ifnull;第 1 行位置 40
命令 2:
sqlContext.sql("select c.id, c.course, isnull(f.amount, 'N/A') from course c left outer join fee f on f.id = c.id").show
错误:
org.apache.spark.sql.AnalysisException:没有 Hive udf class org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPNull 的处理程序,因为:运算符 'IS NULL' 只接受 1 个参数..;第 1 行位置 40
在 Scala 的 sqlContext 中处理这个问题的正确方法是什么?非常感谢。
使用 DataFrameNA 函数。连接完成后,您可以使用 DataFrameNA 填充函数
将所有空值替换为字符串
https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/DataFrameNaFunctions.html
使用 Spark DataFrame API,您可以在 isNull
条件下使用 when/otherwise
:
val course = Seq(
(1, "Hadoop"),
(2, "Spark"),
(3, "HBase"),
(5, "Impala")
).toDF("id", "course")
val fee = Seq(
(2, 3900),
(3, 4200),
(4, 2900)
).toDF("id", "amount")
course.join(fee, Seq("id"), "left_outer").
withColumn("amount", when($"amount".isNull, "N/A").otherwise($"amount")).
show
// +---+------+------+
// | id|course|amount|
// +---+------+------+
// | 1|Hadoop| N/A|
// | 2| Spark| 3900|
// | 3| HBase| 4200|
// | 5|Impala| N/A|
// +---+------+------+
如果您更喜欢使用 Spark SQL,这里有一个等效的 SQL:
course.createOrReplaceTempView("coursetable")
fee.createOrReplaceTempView("feetable")
val result = spark.sql("""
select
c.id, c.course,
case when f.amount is null then 'N/A' else f.amount end as amount
from
coursetable c left outer join feetable f on f.id = c.id
""")
您可以在 简单的 sql 查询 中使用 if
、isnull
函数和 N/A 文字
course.createOrReplaceTempView("c")
fee.createOrReplaceTempView("f")
sqlContext.sql("select c.id, c.course, if(isnull(f.amount), 'N/A', f.amount) as amount from c left outer join f on f.id = c.id").show
你应该有以下输出
+---+------+------+
| id|course|amount|
+---+------+------+
| 1|Hadoop| N/A|
| 2| Spark| 3900|
| 3| HBase| 4200|
| 5|Impala| N/A|
+---+------+------+
希望回答对你有帮助
如果是spark SQL ,使用coalesce UDF
select
c.id,
c.course,
coalesce(f.amount, 'N/A') as amount
from c
left outer join f
on f.id = c.id"
在 sqlContext 中,使用 "NVL"
sqlContext.sql("""
SELECT c.id
,c.course
,NVL(f.amount, 'N/A')
FROM course c
LEFT OUTER
JOIN fee f
ON f.id = c.id
""").show()
我有两个数据文件如下:
course.txt
id,course
1,Hadoop
2,Spark
3,HBase
5,Impala
Fee.txt
id,amount
2,3900
3,4200
4,2900
我需要列出所有课程信息及其费用:
sqlContext.sql("select c.id, c.course, f.amount from course c left outer join fee f on f.id = c.id").show
+---+------+------+
| id|course|amount|
+---+------+------+
| 1|Hadoop| null|
| 2| Spark|3900.0|
| 3| HBase|4200.0|
| 5|Impala| null|
+---+------+------+
如果课程未在费用中注明 table,那么我不想显示 null,而是显示 'N/A'。
我已经尝试了以下但还没有得到:
命令 1:
sqlContext.sql("select c.id, c.course, ifnull(f.amount, 'N/A') from course c left outer join fee f on f.id = c.id").show
错误:org.apache.spark.sql.AnalysisException:未定义函数 ifnull;第 1 行位置 40
命令 2:
sqlContext.sql("select c.id, c.course, isnull(f.amount, 'N/A') from course c left outer join fee f on f.id = c.id").show
错误: org.apache.spark.sql.AnalysisException:没有 Hive udf class org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPNull 的处理程序,因为:运算符 'IS NULL' 只接受 1 个参数..;第 1 行位置 40
在 Scala 的 sqlContext 中处理这个问题的正确方法是什么?非常感谢。
使用 DataFrameNA 函数。连接完成后,您可以使用 DataFrameNA 填充函数
将所有空值替换为字符串https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/DataFrameNaFunctions.html
使用 Spark DataFrame API,您可以在 isNull
条件下使用 when/otherwise
:
val course = Seq(
(1, "Hadoop"),
(2, "Spark"),
(3, "HBase"),
(5, "Impala")
).toDF("id", "course")
val fee = Seq(
(2, 3900),
(3, 4200),
(4, 2900)
).toDF("id", "amount")
course.join(fee, Seq("id"), "left_outer").
withColumn("amount", when($"amount".isNull, "N/A").otherwise($"amount")).
show
// +---+------+------+
// | id|course|amount|
// +---+------+------+
// | 1|Hadoop| N/A|
// | 2| Spark| 3900|
// | 3| HBase| 4200|
// | 5|Impala| N/A|
// +---+------+------+
如果您更喜欢使用 Spark SQL,这里有一个等效的 SQL:
course.createOrReplaceTempView("coursetable")
fee.createOrReplaceTempView("feetable")
val result = spark.sql("""
select
c.id, c.course,
case when f.amount is null then 'N/A' else f.amount end as amount
from
coursetable c left outer join feetable f on f.id = c.id
""")
您可以在 简单的 sql 查询 中使用 if
、isnull
函数和 N/A 文字
course.createOrReplaceTempView("c")
fee.createOrReplaceTempView("f")
sqlContext.sql("select c.id, c.course, if(isnull(f.amount), 'N/A', f.amount) as amount from c left outer join f on f.id = c.id").show
你应该有以下输出
+---+------+------+
| id|course|amount|
+---+------+------+
| 1|Hadoop| N/A|
| 2| Spark| 3900|
| 3| HBase| 4200|
| 5|Impala| N/A|
+---+------+------+
希望回答对你有帮助
如果是spark SQL ,使用coalesce UDF
select
c.id,
c.course,
coalesce(f.amount, 'N/A') as amount
from c
left outer join f
on f.id = c.id"
在 sqlContext 中,使用 "NVL"
sqlContext.sql("""
SELECT c.id
,c.course
,NVL(f.amount, 'N/A')
FROM course c
LEFT OUTER
JOIN fee f
ON f.id = c.id
""").show()