hivecontext未读取文件的架构

fslejnso  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(276)

当我运行以下命令时:

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>
kpbpu008

kpbpu0081#

我知道问题出在哪里了。这就是我创建测试数据的方式。我的印象是,如果我运行以下命令:

create table mydb.mytable1 (empno int, name VARCHAR(20), deptno int) stored as orc;

INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (1, 'EMP1', 100);
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (2, 'EMP2', 50);
INSERT INTO mydb.mytable1(empno, name, deptno) VALUES (3, 'EMP3', 200);

数据将以orc格式创建,地址为:/apps/hive/warehouse/mydb.db/mytable1
结果不是这样。即使我指示“存储为orc”,insert语句也没有保存列信息。不确定这是否是预期的行为。不管怎样,现在一切都正常了。很抱歉造成混乱,但希望这能对将来的人有所帮助-:)

dfty9e19

dfty9e192#

@dilteam这就是问题所在,当您使用配置单元(版本1.x)写入数据时,它不存储orc格式文件的列元数据(对于Parquet地板等不同),这个问题在新的配置单元(2.x)中得到了解决,它将列信息存储在元数据中,从而允许spark从文件本身读取元数据。下面是加载spark中使用hive1编写的表的另一个选项:

val table = spark.table(<db.tablename>)

这里spark是默认的sparksession,它从配置单元元存储中获取表的信息。
还有一个选项提供了更多的代码块和附加信息:
用已定义的模式在获取的rdd上创建dataframe,这将给您更改数据类型的灵活性,您可以在这个链接中读取
https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#programmatically-指定架构
我希望这会有帮助

相关问题