Apache spark Spark SQL为字符串列上的最大值返回null

Apache spark Spark SQL为字符串列上的最大值返回null,apache-spark,hive,apache-spark-sql,partitioning,Apache Spark,Hive,Apache Spark Sql,Partitioning,我的配置单元表是多分区的,如下所示 hive-e“显示分区mydb.mytab;” 请注意,date\u part和att\u name都存储为strings 现在,我想知道最新的分区是用于att_name=zxc的,并获取date\u部分的值。考虑到上述数据,我正在寻找2018-10-13至于其他日期,我没有对应于att_name=zxc的分区。因此,当我执行以下配置单元查询时 hive-e“从mydb.mytab中选择max(日期部分),其中att_name='zxc'” 我明白了 2018

我的配置单元表是多分区的,如下所示

hive-e“显示分区mydb.mytab;”

请注意,
date\u part
att\u name
都存储为strings

现在,我想知道最新的分区是用于
att_name=zxc
的,并获取
date\u部分的值。考虑到上述数据,我正在寻找
2018-10-13
至于其他日期,我没有对应于
att_name=zxc
的分区。因此,当我执行以下配置单元查询时

hive-e“从mydb.mytab中选择max(日期部分),其中att_name='zxc'”

我明白了

2018-10-13

这是完美的

接下来,我尝试用spark sql做同样的事情

import org.apache.spark.sql.SparkSession

lazy val sparkSess = SparkSession.builder
    .appName("myApp")
    .enableHiveSupport()
    .getOrCreate()
sparkSess.sql("select max(date_part) from mydb.mytab where att_name = 'zxc'").show()
但是为了这个,我得到了

+--------------+
|max(date_part)|
+--------------+
|          null|
+--------------+
我想这是因为
date\u部分是一个字符串列。但是为什么配置单元查询没有问题呢

我做错了什么

这是从多分区表有条件地获取最新分区的正确方法吗

表格说明

Logging initialized using configuration in file:/etc/hive/conf.bfd-puppet/hive-log4j.properties
OK
# col_name              data_type               comment

id                      string
value                   string

# Partition Information
# col_name              data_type               comment

date_part               string
att_name                string

# Detailed Table Information
Database:               mydb
Owner:                  mytab
CreateTime:             some timestamp
LastAccessTime:         UNKNOWN
Protect Mode:           None
Retention:              0
Location:               maprfs:/path/to/hive/mydb.db/mytab
Table Type:             EXTERNAL_TABLE
Table Parameters:
    EXTERNAL                TRUE
    transient_lastDdlTime   136786171357

# Storage Information
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat:            org.apache.hadoop.mapred.SequenceFileInputFormat
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
Compressed:             No
Num Buckets:            -1
Bucket Columns:         []
Sort Columns:           []
Storage Desc Params:
    serialization.format    1
Time taken: 0.201 seconds, Fetched: 34 row(s)
打印模式

因此,对于我试图执行的查询

scala> val bsv1 = sess.sql(s"SELECT max(date_part) FROM mydb.mytab WHERE att_name='zxc'")
bsv1: org.apache.spark.sql.DataFrame = [max(date_part): string]

scala> bsv1.printSchema()
root
 |-- max(date_part): string (nullable = true)


scala>
但是,当我尝试另一个查询时

scala> val bsv1 = sess.sql(s"SELECT * FROM mydb.mytab WHERE date_part='2018-12-01' and att_name='zxc'")
18/12/12 10:02:28 WARN SparkSession$Builder: Using an existing SparkSession; some configuration may not take effect.
bsv1: org.apache.spark.sql.DataFrame = [id: string, value: string ... 2 more fields]

scala> bsv1.printSchema
   def printSchema(): Unit

scala> bsv1.printSchema()
root
 |-- id: string (nullable = true)
 |-- value: string (nullable = true)
 |-- date_part: string (nullable = true)
 |-- att_name: string (nullable = true)

您使用的是什么spark版本?我有2.2.0版本您可以为该表共享配置单元
desc formatted
,以及
printSchema
?谢谢@shay\uuuuu我已经更新了帖子
scala> val bsv1 = sess.sql(s"SELECT * FROM mydb.mytab WHERE date_part='2018-12-01' and att_name='zxc'")
18/12/12 10:02:28 WARN SparkSession$Builder: Using an existing SparkSession; some configuration may not take effect.
bsv1: org.apache.spark.sql.DataFrame = [id: string, value: string ... 2 more fields]

scala> bsv1.printSchema
   def printSchema(): Unit

scala> bsv1.printSchema()
root
 |-- id: string (nullable = true)
 |-- value: string (nullable = true)
 |-- date_part: string (nullable = true)
 |-- att_name: string (nullable = true)