当前位置: 首页 > 知识库问答 >
问题:

HiveContext未读取ORC文件的架构

勾俊
2023-03-14

当我运行以下命令时:

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

这些列打印为“_col0”、“_col1”、“_col2”等。而不是它们的真实名称,如“empno”、“name”、“Deptno”。

当我在Hive中“description 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”

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)

顺便说一下,我正在使用自己的蜂巢网站。xml,其中包含以下内容:

<configuration>
    <property>
      <name>hive.metastore.uris</name>
      <value>thrift://sandbox.hortonworks.com:9083</value>
    </property>
</configuration>

共有2个答案

韩阳云
2023-03-14

@DilTeam这就是问题所在,当您使用配置单元(版本1.x)写入数据时,它不存储orc格式文件的列元数据(对于拼花等不同),这个问题在新的配置单元(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-指定架构

我希望这会有帮助

史钊
2023-03-14

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

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

 类似资料:
  • 我必须更改ORC文件的模式。ORC保存在adls位置。 orc文件中的原始模式是旧模式列标题:(C1、C2、C3、C4) 我想用新模式(从结构类型和结构字段创建。)新模式列标题:(姓名、年龄、性别、时间)覆盖原始模式 我使用的spark命令是:val df2=spark。阅读格式(“orc”)。架构(schema)。加载(“路径/”) 只要我运行df2。显示(2,错误) 所有列的数据都变为空。 当

  • 我的spring-security.xml是 忽略XML验证警告org.XML.sax.saxParseException:schema_reference.4:无法读取架构文档“http://www.springframework.org/schema/security/spring-security-3.2.xsd”,因为1)找不到文档;2)无法读取文档;3)文档的根元素不是。 我导入的库是:

  • 我有一个名为“add”的方法,它将字符串作为参数,并使用bufferedwriter将其写入文件。完成此操作后,bufferedwriter将被刷新。 在另一个方法“read”中,我遍历文件中的行,但这些行是空的(因此我不能打印它们)。

  • 我有一个ACID hive表,里面有ORC格式的文件。尝试压缩时,出现以下错误:完整错误如下: 这个表是通过将avro文件创建和更新到一个orc表中的,因此产生了一组delta,和。 我有很多其他这样的表格,它们没有这个问题。这个表没有什么特别之处,实际上非常小(<100k行,磁盘上有2.5M),并且在上个月更新了100次(更新了20k行,更新了5M数据)。DDL为: 这每隔几个月就会发生一次。由

  • 我试着用上传的文件创建ReadSteam并将管道连接到WriteStream: 但出现了这个错误:

  • 我想使用pyspark 2.0读取一些ORC文件,但不使用metastore。理论上,这样做是可行的,因为数据模式嵌入在ORC文件中。但我得到的是: 读取ORC文件的正确方法是什么?