select*在对存储在hdfs中的orc文件创建外部表之后,为timestamp返回空值

drnojrws  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(343)

我正在hdfs中存储的orc文件上创建一个外部表。我有 process_timestamp 数据文件中带有时间戳的列。
创建表之后,我执行了 MSCK REPAIR TABLE <TABLE-NAME> . 但是,在查询表timestamp时,列返回空值,而不是实际的时间戳

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` 看起来像这样 `'2019-09-09 00:00:00'` 在兽人档案里
模式看起来也不错:

--process_timestamp: timestamp (nullable = true)

但是在查询时,会返回空值 `process_timestamp - NULL` 我试着像下面那样设置serde属性,但没有用。

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

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

s3fp2yjn1#

我通过将文件直接保存在hdfs位置作为orc并在数据上创建外部表来解决了这个问题。问题是如何将文件保存到hdfs位置。

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

在上面的语句中,我添加了partitionby(),并对外部表进行了msck,效果非常好。

相关问题