gpt4 book ai didi

java - 无法查看通过 Spark SQL 创建的新数据

转载 作者:行者123 更新时间:2023-12-02 10:50:57 27 4
gpt4 key购买 nike

我遇到一个问题,无法查看 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;

然后创建一个数据框和一个新列并加载它们

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中的所有数据。然后我们将创建另一个带有新列的数据框

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)

加载后,只有地址列显示为空。而这种情况只发生在 hive 中。 Spark 完美地显示了这些列(因此其中的数据,hive 正在努力读取此列)。谁能建议如何解决这个问题?

最佳答案

您可以在第一次尝试时看到年龄列的数据,因为尚未在配置单元中创建分区,因此配置单元使用当前可用的架构,其中包括年龄列。

在第二次尝试时,您正在写入 hive 的现有分区,因此 hive 正在对创建分区后添加的所有列应用空值。

如果您将新数据写入任何新分区,您将立即看到数据。

如果您删除分区,然后写入已缓存的相同数据帧,则 hive 在查询时也会显示地址。

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

这似乎是由于配置单元错误而发生的 https://issues.apache.org/jira/browse/HIVE-6131

关于java - 无法查看通过 Spark SQL 创建的新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59428896/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com