给定一些表操作-创建一个有2行和2列的表,添加第三列,并插入第三行,有3个值
CREATE TABLE concat_test(
one string,
two string
)
STORED AS ORC;
INSERT INTO TABLE concat_test VALUES (1,1), (2,2);
ALTER TABLE concat_test ADD COLUMNS (three string);
INSERT INTO TABLE concat_test VALUES (3,3,3);
alter table concat_test concatenate;
当我尝试用Spark读取它时,我有一个异常Caused by: java.lang.ArrayIndexOutOfBoundsException: 3
spark.sql("select * from concat_test").collect()
与列数明显相关。我在进一步调查兽人的问题。我没有找到这种分区的快速修复方法,也没有找到其他地方描述的错误。有吗?
有人可以在最新的hadoop版本上尝试这个吗?bug存在吗?
Hive 1.2.1, Spark 2.3.2
乌利希期刊指南。我自己通过Hive修复了我的桌子。在此操作之后,Hive查询确实工作,因此我创建了复制表,并对旧数据进行了select-insert。
我以前完全遇到过这个问题!
这是一个已知问题。
Hive只在读取时执行schema,所以它没有理由将此检测为一个问题,并且会很高兴地让您定义任何您想要的定义。当您更改hive表的定义时,表底层的数据不会NOT得到更新。一般来说,我通过修复底层ORC文件来满足hive定义来解决这个问题。你可以直接读取ORC文件,因为这个问题现在已经解决了。
如果您知道底层orc文件的格式不正确,并且想要纠正格式,可以使用以下方法:
val s = Seq(("apple","apples"),("car","cars")) // create data
val t = Seq(("apple",12),("apples", 50),("car",5),("cars",40))// create data
val df1 = sc.parallelize(t).toDF("Sub_Cat", "Count")
val df2 = sc.parallelize(s).toDF("Main_Cat","Sub_Cat")
df1.write.format("orc").save("category_count")
df2.write.format("orc").save("categories")
val schema = StructType( Array( StructField("Main_Cat", StringType, nullable = true), StructField("Sub_Cat", StringType, nullable = true),StructField("Count", IntegerType, nullable = true)) )
val CorrectedSchema = spark.read.schema(schema).org("category_count")
CorrectedSchema.show()
这有助于将Schema更正为您想要的格式。如果你信任hive模式,你可以使用这个欺骗来获取模式。(并减少输入)
val schema = spark.sql("select * from concat_test limit 0").schema