无法查看通过spark sql创建的新数据

e37o9pze  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(262)

我正面临一个问题,在这个问题中,我无法查看来自hive的一些数据。重现问题的步骤。创建表

drop table if exists hive_parquet_nulls_test ;

create table hive_parquet_nulls_test (
name String
)
 partitioned by (report_date DATE)
 stored as PARQUET;

然后创建一个Dataframe,并使用一个新列加载它们

import java.sql.Date
import org.apache.spark.sql._
import org.apache.spark.sql.functions._

case class Person(name : String, age : Int, report_date : Date)

val df = sc.parallelize(
    Seq(Person("Steve", 30, Date.valueOf("2016-09-30")), 
        Person("James", 29, Date.valueOf("2016-09-30")))).toDF

df.show(false)

spark.sql(s"ALTER TABLE hive_parquet_nulls_test  ADD COLUMNS (age integer)");
spark.sql(s"REFRESH TABLE hive_parquet_nulls_test");

df.write.mode(SaveMode.Overwrite).insertInto("hive_parquet_nulls_test")

此时,我们可以看到Hive中的所有数据。然后我们将用一个新列创建另一个Dataframe

val df = spark.table("hive_parquet_nulls_test")

val newDF = df.withColumn("address", lit("123 Green Avenue, London"))

newDF.show(false)

spark.sql(s"ALTER TABLE hive_parquet_nulls_test  ADD COLUMNS (address string)")
spark.sql(s"REFRESH TABLE hive_parquet_nulls_test")

spark.sql(s"describe hive_parquet_nulls_test")

val finalFieldNames = newDF.schema.fieldNames

val finalPartitionedDF = newDF.select($"name", $"age", $"address", $"report_date")
      .cache()

finalPartitionedDF.write.mode(SaveMode.Overwrite).insertInto("hive_parquet_nulls_test_test")

spark.table("hive_parquet_nulls_test").show(false)

加载后,只有address列显示为null。这只发生在 hive 里。spark完美地显示了这些列(因此数据在那里,hive很难读取这些列)。有人能建议如何解决这个问题吗?

8oomwypt

8oomwypt1#

由于分区尚未在配置单元中创建,所以您可以在第一次尝试时看到年龄列的数据,所以配置单元使用了当前可用的架构,其中包括年龄列。
第二次尝试时,您正在写入配置单元的现有分区,因此配置单元正在为创建分区后添加的所有列应用空值。
如果您将新数据写入任何新分区,那么您将立即看到数据。
如果删除分区,然后写入缓存的Dataframe,则配置单元在查询时也会显示地址。

spark.sql("alter table hive_parquet_nulls_test drop partition(report_date='2016-09-30')");
finalPartitionedDF.write.mode(SaveMode.Overwrite).insertInto("hive_parquet_nulls_test")

在Hive壳上:

select address from hive_parquet_nulls_test;
OK
123 Green Avenue, London
123 Green Avenue, London

好像是因为 hive 里的虫子https://issues.apache.org/jira/browse/hive-6131

相关问题