3

当我运行以下命令时:

val df1 = sqlContext.read.format("orc").load(myPath)
df1.columns.map(m => println(m))

列打印为“_col0”、“_col1”、“_col2”等。与它们的真实名称相反,例如“empno”、“name”、“deptno”。

当我在 Hive 中“描述 mytable”时,它会正确打印列名,但是当我运行“orcfiledump”时,它也会显示 _col0、_col1、_col2。我是否必须指定“读取模式”或其他内容?如果是,我该如何在 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>
4

2 回答 2

0

@DilTeam 这是问题所在,当您使用 Hive(版本 1.x)写入数据时,它不会存储 orc 格式文件的列元数据(对于镶木地板等不一样),此问题已在 new Hive( 2.x) 将列信息存储在元数据中,允许 spark 从文件本身读取元数据。这是在 spark 中加载使用 Hive1 编写的表的另一个选项:

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

这里 spark 是默认的 sparkSession,它从 hive 元存储中获取表的信息。

另一个选项带有更多代码块和额外信息:

在获取的 RDD 上创建具有定义模式的数据框,这将使您可以灵活地更改数据类型,您可以在此链接中阅读

https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#programmatically-specifying-the-schema

我希望这个能帮上忙

于 2018-12-27T13:25:20.370 回答
0

我弄清楚了问题所在。这是我创建测试数据的方式。我的印象是,如果我运行以下命令:

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 语句也没有保存列信息。不确定这是否是预期的行为。无论如何,现在一切正常。为混乱道歉,但希望这将有助于未来的人-:)

于 2016-08-03T21:35:33.597 回答