动机:我想将数据加载到Apache Drill中。我知道Drill可以处理JSON输入,但我想看看它如何在Parquet数据上执行。将JSON对象的文件转换为Parquet文件
有没有办法做到这一点,而无需首先将数据加载到Hive等,然后使用其中一个Parquet连接器来生成输出文件?
动机:我想将数据加载到Apache Drill中。我知道Drill可以处理JSON输入,但我想看看它如何在Parquet数据上执行。将JSON对象的文件转换为Parquet文件
有没有办法做到这一点,而无需首先将数据加载到Hive等,然后使用其中一个Parquet连接器来生成输出文件?
实际上,您可以使用Drill本身从任何查询的输出创建parquet文件。
create table student_parquet as select * from `student.json`;
上面的行应该足够好。 Drill根据字段中的数据解释类型。您可以替换自己的查询并创建镶木地板文件。
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作业来完成导入。
要完成@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来包含所有可能性。如果有人知道更好的方式来做到这一点,我会很高兴。
无需选择单个列。一个简单的选择*应该工作。既然你看到一个错误,我想你的'成员'结构在不同的记录中有不同数量的字段。此外,请注意,从今天开始,无法处理同一列中的模式更改。所以如果你有一个'val1'列,它有不同记录的字符串和整数的组合,那么钻取将无法处理它。 – rahul
相关:http://stackoverflow.com/questions/30565510/how-to-read-and-write-mapstring-object-from-to-parquet-file-in-java-or-scala – okigan