我遇到一个问题,我无法查看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")
这时,我们可以看到来自蜂巢的所有数据。然后,我们将使用新列创建另一个数据框
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)
加载后,只有地址列显示为空。那只发生在蜂巢中。 Spark可以完美地显示各列(因此,其中的数据使配置单元难以读取此列)。谁能建议如何解决这个问题?
参考方案
您可以在“年龄”列的首次尝试中看到数据,因为尚未在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")
在蜂巢壳上:
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 Double与BigDecimal - java我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…
当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…
Java-父类正在从子类中调用方法? - java抱歉,我还是编码的新手,可能还没有掌握所有术语。希望您仍然能理解我的问题。我想得到的输出是:"Cost for Parent is: 77.77" "Cost for Child is: 33.33" 但是,我得到这个:"Cost for Parent is: 33.33" "Cost f…
Java Map,如何将UTF-8字符串正确放置到地图? - java我有一个地图,LinkedHashMap更确切地说。我想在上面放一个字符串对象。然后,我读取此值以查看实际存储的内容。字符串本身具有非ASCII字符(西里尔文,韩文等)。将其放到地图上然后阅读后,这些字符将替换为??? s。一些代码:Map obj = new LinkedHashMap(); System.out.println("name: &…
java.net.URI.create异常 - javajava.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…