Spark SQL возвращает значение null для max в строковом столбце - PullRequest
0 голосов
/ 06 декабря 2018

Моя таблица Hive состоит из нескольких разделов следующим образом

hive -e "show partitions mydb.mytab;"

date_part=2018-10-11/att_name=asd
date_part=2018-10-12/att_name=qwe
date_part=2018-10-13/att_name=zxc
date_part=2018-10-14/att_name=asd
date_part=2018-10-15/att_name=qwe
date_part=2018-10-16/att_name=asd

Обратите внимание, что date_part и att_name оба хранятся в виде string s

Теперь я хочу знать, какой последний раздел для att_name=zxc, и получить значение date_part.Учитывая данные выше, я ищу 2018-10-13, как и для других дат, у меня нет раздела, соответствующего att_name=zxc.Итак, когда я выполняю следующий запрос улья,

hive -e "select max(date_part) from mydb.mytab where 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_part являетсяСтрока столбца.но тогда почему у запроса улья нет проблем?

Что я делаю не так?

Это правильный способ условно получить последний раздел из многораздельной таблицы?

Таблица Описание

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)
...