使用 impala jdbc 驱动程序时,not null 在 Pyspark 中不起作用

Posted

技术标签:

【中文标题】使用 impala jdbc 驱动程序时,not null 在 Pyspark 中不起作用【英文标题】:not null not working in Pyspark when using impala jdbc driver 【发布时间】:2021-04-01 04:18:04 【问题描述】:

我是 Pyspark 的新手。我正在使用 Impala JDBC 驱动程序 ImpalaJDBC41.jar 。在我的 pyspark 代码中,我使用以下代码。

df =  spark.read \
      .format("jdbc") \
      .option("url", "jdbc:impala://<instance>:21051") \
      .option("query", "select dst_val,node_name,trunc(starttime,'SS') as starttime from def.tbl_dst where node_name is not null and trunc(starttime,'HH') >= trunc(hours_add(now(),-1),'HH') and trunc(starttime,'HH') < trunc(now(),'HH')") \
      .option("user", "") \
      .option("password", "") \
      .load()

但上述不起作用,“node_name is not null”不起作用。此外 trunc(starttime,'SS') 也不起作用。任何帮助将不胜感激。

sample input data :

dst_val,node_name,starttime
BCD098,,2021-03-26 15:42:06.890000000
BCD043,HKR_NODEF,2021-03-26 20:31:09
BCD038,BCF_NODEK,2021-03-26 21:29:10


Expected output :

dst_val,node_name,starttime
BCD043,HKR_NODEF,2021-03-26 20:31:09
BCD038,BCF_NODEK,2021-03-26 21:29:10

为了调试,我正在尝试打印 df.show。但是没有用。 我正在使用 df.show() ,但它仍然显示为 null 的记录。 node_name 的数据类型是“STRING”

【问题讨论】:

【参考方案1】:

你能用这个吗?

select dst_val,node_name,cast( from_timestamp(starttime,'SSS') as bigint) as starttime from def.tbl_dst where (node_name is not null or node_name<>'' ) and trunc(starttime,'HH') >= trunc(hours_add(now(),-1),'HH') and trunc(starttime,'HH') < trunc(now(),'HH')

我认为node_name 里面有空白空间,上面的sql(我添加了or node_name&lt;&gt;'')会处理它。 现在,如果您有一些不可打印的字符,那么我们可能需要进行相应的检查。

编辑:由于不是 null 在 Impala 中工作,我认为这可能是一个火花问题。

【讨论】:

我累了。这没用。这些是实际的空值。 如果你从 hive 命令提示符/shell 运行它,你会得到数据吗? 如果我将其作为直接 impala 查询运行,“not null”有效,但仍会错过以毫秒为单位的时间戳 cast( from_timestamp(starttime,'SSS') as bigint) - 这会给你毫秒。

以上是关于使用 impala jdbc 驱动程序时,not null 在 Pyspark 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Impala JDBC 驱动程序通过 Java 应用程序连接到 Impala

在没有 Impala JDBC 驱动程序的情况下从 R 连接到 Impala

在 kerberos 授权下使用 JDBC 连接到 impala 时出错

使用jdbc查询impala时的超时问题

Impala 通过 jdbc 使元数据无效

为啥从 BigDecimal 转换为 DECIMAL 时 impala-jdbc 会抛出异常?