2014-02-11 88 views
14

动机:我想将数据加载到Apache Drill中。我知道Drill可以处理JSON输入,但我想看看它如何在Parquet数据上执行。将JSON对象的文件转换为Parquet文件

有没有办法做到这一点,而无需首先将数据加载到Hive等,然后使用其中一个Parquet连接器来生成输出文件?

+0

相关:http://stackoverflow.com/questions/30565510/how-to-read-and-write-mapstring-object-from-to-parquet-file-in-java-or-scala – okigan

回答

2

实际上,您可以使用Drill本身从任何查询的输出创建parquet文件。

create table student_parquet as select * from `student.json`; 

上面的行应该足够好。 Drill根据字段中的数据解释类型。您可以替换自己的查询并创建镶木地板文件。

4

Kite支持通过其命令行实用程序kite-dataset将JSON导入到Avro和Parquet格式。

首先,你会推断出你的JSON的架构:

kite-dataset json-schema sample-file.json -o schema.avsc

然后你就可以使用该文件来创建一个平面蜂巢表:

kite-dataset create mytable --schema schema.avsc --format parquet

最后,你可以将您的JSON加载到数据集中。

kite-dataset json-import sample-file.json mytable

您也可以导入整个直接存储在HDFS。在这种情况下,风筝会使用MR作业来完成导入。

+0

FYI - I试过这个,它需要一个hadoop安装。我也试图将这些文件转换成钻,并且我没有hadoop。 – Yehosef

+0

正确。上面的链接用于安装在Hadoop集群上。如果你愿意,Maven中心还有一个包含依赖关系的tarball分发版。这个问题的麻烦在于你必须决定这些依赖关系应该是什么,这取决于Hadoop发行版。这就是为什么我建议使用从您运行的集群获取Hadoop依赖关系的指示信息。 – blue

1

要完成@rahul的答案,您可以使用钻取来完成此操作 - 但我需要向查询中添加更多内容,以便在钻取时使用它。

create table dfs.tmp.`filename.parquet` as select * from dfs.`/tmp/filename.json` t 

我需要给它的存储插件(DFS)和“根”的配置可以从整个磁盘读取和不可写。但是tmp config(dfs.tmp)是可写的并写入到/ tmp。所以我写信给那里。

但问题是,如果JSON是嵌套的或可能包含特殊字符,我会得到一个神秘的

org.apache.drill.common.exceptions.UserRemoteException: SYSTEM ERROR: java.lang.IndexOutOfBoundsException: 

如果我有一个看起来像members: {id:123, name:"joe"}的结构我会选择更改为

select members.id as members_id, members.name as members_name

select members.id as `members.id`, members.name as `members.name`

得到它的工作。

我假设原因是镶木地板是一个“列”商店,所以你需要列。 JSON不是默认的,所以你需要转换它。

问题是我必须知道我的json模式,我必须构建select来包含所有可能性。如果有人知道更好的方式来做到这一点,我会很高兴。

+0

无需选择单个列。一个简单的选择*应该工作。既然你看到一个错误,我想你的'成员'结构在不同的记录中有不同数量的字段。此外,请注意,从今天开始,无法处理同一列中的模式更改。所以如果你有一个'val1'列,它有不同记录的字符串和整数的组合,那么钻取将无法处理它。 – rahul