3

次を実行すると:

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

列は、'empno'、'name'、'deptno' などの実際の名前とは対照的に、'_col0'、'_col1'、'_col2' などとして出力されます。

Hive で「describe 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

私は問題が何であるかを理解しました。それは私がテストデータを作成していた方法でした。次のコマンドを実行すると、次のような印象を受けました。

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);

データは/apps/hive/warehouse/mydb.db/mytable1に ORC 形式で作成されます。

そうではないことがわかりました。「orc として保存」と指定しましたが、INSERT ステートメントは列情報を保存しませんでした。それが予想される動作かどうかはわかりません。いずれにせよ、それは今すべて動作します。混乱をお詫びしますが、これが将来誰かを助けることを願っています-:)

于 2016-08-03T21:35:33.597 に答える