scala - 无法从 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()
请帮助我们。
先感谢您。
解决方案
在彻底检查了以下类的源代码后,我遇到了这个问题:
- 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"); 在我的应用程序中,问题已经消失。
我希望它可以帮助别人。
推荐阅读
- node.js - 如何在 nodejs 应用程序中为 mailgun-js 创建带有玩笑的手动模拟?
- compiler-construction - 使用 Bazel 构建时如何发出 LLVM IR?
- python-3.x - groupby 在多个列上并应用各种功能
- javascript - 通过上一个值递归地在 JSON 数组中查找父级反向连接
- python - 如果没有选择对象,则 View3d 运算符不可用。为什么?
- python-3.x - 自组织地图无法完美运行,始终与输出相同的类
- java - 如何在 Spring 中使用 @Id 注释来注释最终 id 字段
- android - RoomDb 查询返回 null
- macos - 如何在 Mac OS 上查看 Dot Net Core 项目的 Web 服务器日志?
- actionscript-3 - 我的角色怎么能向左箭头键或右键的方向跳跃?