首页 > 解决方案 > 无法从 hdp 3 中超过 25 列的 spark 数据帧加载配置单元表

问题描述

我们试图从 spark shell 填充蜂巢表。使用 hive 仓库连接器将具有 25 列的数据框成功添加到 hive 表中。但是超过这个限制,我们得到了以下错误:

Caused by: java.lang.IllegalArgumentException: Missing required char ':' at 'struct<_c0:string,_c1:string,_c2:string,_c3:string,_c4:string,_c5:string,_c6:string,_c7:string,_c8:string,_c9:string,_c10:string,_c11:string,_c12:string,_c13:string,_c14:string,_c15:string,_c16:string,_c17:string,_c18:string,_c19:string,_c20:string,_c21:string,_c22:string,_c23:string,...^ 2 more fields>'
  at org.apache.orc.TypeDescription.requireChar(TypeDescription.java:293)

下面是示例输入文件数据(输入文件为 csv 类型)。

|col1                |col2 |col3 |col4               |col5    |col6           |col7       |col8    |col9    |col10   |col11   |col12   |col13   |col14   |col15   |col16 |col17|col18                                        |col19   |col20  |col21    |col22    |col23    |col24                               |col25|col26     |
|--------------------|-----|-----|-------------------|--------|---------------|-----------|--------|--------|--------|--------|--------|--------|--------|--------|------|-----|---------------------------------------------|--------|-------|---------|---------|---------|------------------------------------|-----|----------|
|11111100000000000000|CID81|DID72|2015-08-31 00:17:00|null_val|919122222222222|1627298243 |null_val|null_val|null_val|null_val|null_val|null_val|Download|null_val|Mobile|NA   |x-nid:xyz<-ch-nid->N4444.245881.ABC-119490111|12452524|1586949|sometext |sometext |sometext1|8b8d94af-5407-42fa-9c4f-baaa618377c8|Click|2015-08-31|
|22222200000000000000|CID82|DID73|2015-08-31 00:57:00|null_val|919122222222222|73171145211|null_val|null_val|null_val|null_val|null_val|null_val|Download|null_val|Tablet|NA   |x-nid:xyz<-ch-nid->N4444.245881.ABC-119490111|12452530|1586956|88200211 |88200211 |sometext2|9b04580d-1669-4eb3-a5b0-4d9cec422f93|Click|2015-08-31|
|33333300000000000000|CID83|DID74|2015-08-31 00:17:00|null_val|919122222222222|73171145211|null_val|null_val|null_val|null_val|null_val|null_val|Download|null_val|Laptop|NA   |x-nid:xyz<-ch-nid->N4444.245881.ABC-119490111|12452533|1586952|sometext2|sometext2|sometext3|3ab8511d-6f85-4e1f-8b11-a1d9b159f22f|Click|2015-08-31|

Spark shell 是使用以下命令实例化的:

spark-shell --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-1.0.0.3.0.1.0-187.jar --conf spark.hadoop.metastore.catalog.default=hive --conf spark.sql.hive.hiveserver2.jdbc.url="jdbc:hive2://sandbox-hdp.hortonworks.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;user=raj_ops"

HDP 的版本是 3.0.1

Hive 表是使用以下命令创建的:

val hive = com.hortonworks.spark.sql.hive.llap.HiveWarehouseBuilder.session(spark).build()

hive.createTable("tablename").ifNotExists().column()...create()

使用以下命令保存数据:

df.write.format("com.hortonworks.spark.sql.hive.llap.HiveWarehouseConnector").option("table", "tablename").mode("append").save()

请帮助我们。

先感谢您。

标签: scalaapache-sparkhadoophivehdp

解决方案


在彻底检查了以下类的源代码后,我遇到了这个问题:

  • org.apache.orc.TypeDescription
  • org.apache.spark.sql.types.StructType
  • org.apache.spark.util.Utils

我发现罪魁祸首是DEFAULT_MAX_TO_STRING_FIELDS类内的变量org.apache.spark.util.Utils

/* The performance overhead of creating and logging strings for wide schemas can be large. To limit the impact, we bound the number of fields to include by default. This can be overridden by setting the 'spark.debug.maxToStringFields' conf in SparkEnv. */

val DEFAULT_MAX_TO_STRING_FIELDS = 25

因此,设置此属性后,例如:conf.set("spark.debug.maxToStringFields", "128"); 在我的应用程序中,问题已经消失。

我希望它可以帮助别人。


推荐阅读