当我运行以下命令时:
val df1 = sqlContext.read.format("orc").load(myPath)
df1.columns.map(m => println(m))
列打印为“\u col0”、“\u col1”、“\u col2”等,而不是它们的真实名称,如“empno”、“name”、“deptno”。
当我在hive中“describe mytable”时,它会正确打印列名,但当我运行“orcfiledump”时,它也会显示\u col0、\u col1、\u col2。我必须指定“schema on read”还是什么?如果是,如何在spark/scala中实现?
hive --orcfiledump /apps/hive/warehouse/mydb.db/mytable1
.....
fieldNames: "_col0"
fieldNames: "_col1"
fieldNames: "_col2"
注意:我创建了如下表:
create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc;
注意:这不是此问题的重复(hadoop orc文件-工作原理-如何获取元数据),因为答案告诉我使用“hive”&我已经在使用hivecontext,如下所示:
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
顺便说一下,我正在使用自己的hive-site.xml,它包含以下内容:
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://sandbox.hortonworks.com:9083</value>
</property>
</configuration>
2条答案
按热度按时间kpbpu0081#
我知道问题出在哪里了。这就是我创建测试数据的方式。我的印象是,如果我运行以下命令:
数据将以orc格式创建,地址为:/apps/hive/warehouse/mydb.db/mytable1
结果不是这样。即使我指示“存储为orc”,insert语句也没有保存列信息。不确定这是否是预期的行为。不管怎样,现在一切都正常了。很抱歉造成混乱,但希望这能对将来的人有所帮助-:)
dfty9e192#
@dilteam这就是问题所在,当您使用配置单元(版本1.x)写入数据时,它不存储orc格式文件的列元数据(对于Parquet地板等不同),这个问题在新的配置单元(2.x)中得到了解决,它将列信息存储在元数据中,从而允许spark从文件本身读取元数据。下面是加载spark中使用hive1编写的表的另一个选项:
这里spark是默认的sparksession,它从配置单元元存储中获取表的信息。
还有一个选项提供了更多的代码块和附加信息:
用已定义的模式在获取的rdd上创建dataframe,这将给您更改数据类型的灵活性,您可以在这个链接中读取
https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#programmatically-指定架构
我希望这会有帮助