Моя таблица 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)