【问题标题】:select * returns null values for timestamp after creating external table on orc files stored in hdfs在存储在 hdfs 中的 orc 文件上创建外部表后,select * 返回时间戳的空值
【发布时间】:2019-09-09 18:07:48
【问题描述】:

我正在存储在 hdfs 中的 orc 文件之上创建一个外部表。我在数据文件中有 process_timestamp 列和时间戳。

创建表后,我执行MSCK REPAIR TABLE <TABLE-NAME>。但是,查询表时间戳列时返回空值而不是实际时间戳

from datetime import date
from pyspark.sql.functions import lit, to_date, from_unixtime, unix_timestamp
from pyspark.sql import SparkSession
spark = SparkSession.builder \
        .appName("test_conn") \
        .getOrCreate()

df = spark.createDataFrame([('Alice', 1)])

timestamp = today.strftime("%Y-%m-%d %H:%M:%S")

df = df.withColumn('process_timestamp', unix_timestamp(lit(timestamp), 'yyyy-MM-dd HH:mm:ss').cast('timestamp'))

process_timestamp 在 orc 文件中看起来像这样 '2019-09-09 00:00:00'

Schema 看起来也不错:

--process_timestamp: timestamp (nullable = true)

但是在查询时,会返回空值process_timestamp - NULL

我尝试如下设置 serde 属性,但没有用。

ALTER TABLE <table_name> SET SERDEPROPERTIES ("timestamp.formats"="yyyy-MM-dd'T'HH:mm:ss"); 

请帮我解决这个问题。查询时如何从外部表返回实际时间戳值?任何帮助将不胜感激。

【问题讨论】:

  • 您可以使用 ORC 工具查看 ORC 文件。 orc.apache.org/docs/java-tools.html 它将帮助您确定问题是在数据中还是在元数据中。您还可以将该字段添加为字符串并查看返回的内容。时间戳类型更敏感。

标签: hadoop hive pyspark orc external-tables


【解决方案1】:

我通过将文件直接保存在 hdfs 位置作为 ORC 并在数据之上创建外部表来解决此问题。问题在于将文件保存到 hdfs 位置。

df.coalesce(1).write.format('orc').mode('append').partitionBy('process_date').save(path)

在上面的语句中,我添加了 partitionBy() 并在外部表上做了一个 MSCK,它就像一个魅力。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多