将JSON对象文件转换为Parquet文件

18

动机: 我想将数据加载到Apache Drill中。我知道Drill可以处理JSON输入,但是我想看看它在Parquet数据上的性能表现。

是否有任何方法可以在不先将数据加载到Hive等程序中,然后使用其中一个Parquet连接器生成输出文件的情况下实现这一点?


相关链接:https://dev59.com/4F0a5IYBdhLWcg3wPGeQ - okigan
3个回答

5
Kite支持使用其命令行实用程序kite-dataset将JSON导入到Avro和Parquet格式中。
首先,你需要推断出JSON的模式: kite-dataset json-schema sample-file.json -o schema.avsc 然后,您可以使用该文件创建一个Parquet Hive表: kite-dataset create mytable --schema schema.avsc --format parquet 最后,您可以将JSON加载到数据集中。 kite-dataset json-import sample-file.json mytable 您还可以导入存储在HDFS中的整个目录。在这种情况下,Kite将使用MR作业进行导入。

FYI - 我尝试过这个,需要Hadoop安装。我还在努力将文件转换为Drill可用格式,但我没有Hadoop。 - Yehosef
正确。上面的链接是用于在Hadoop集群上安装。如果您愿意,Maven中央库中也有一个tarball分发包,其中包括依赖项。但这个分发包的问题在于您必须决定这些依赖项应该是什么,这因Hadoop版本而异。这就是为什么我建议使用从您正在运行的集群获取Hadoop依赖项的说明。 - blue

4
你可以使用Drill本身将任何查询的输出创建为Parquet文件。
create table student_parquet as select * from `student.json`;

上述代码已经足够好用了。Drill根据字段中的数据来解释类型。您可以替换自己的查询并创建一个parquet文件。


1
为了完善@rahul的回答,您可以使用drill来完成这个操作 - 但我需要在查询中添加更多内容,以便使其能够与drill开箱即用。
create table dfs.tmp.`filename.parquet` as select * from dfs.`/tmp/filename.json` t

我需要为它提供存储插件(dfs),"root"配置可以读取整个磁盘,但不可写。但是tmp配置(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_nameselect members.id as `members.id`, members.name as `members.name` 以使其正常工作。
我认为原因是parquet是一种“列”存储,所以您需要列。JSON不是默认值,因此您需要转换它。
问题在于我必须知道我的JSON模式,并且必须构建选择来包括所有可能性。如果有人知道更好的方法,请告诉我。

不需要选择单独的列,简单的select *就可以了。由于您看到了一个错误,我猜测您的“成员”结构在不同记录中具有不同数量的字段。同时请注意,截至今天,Drill无法处理同一列中的模式更改。因此,如果您有一个名为“val1”的列,其中包含不同记录的字符串和整数组合,则Drill将无法处理它。 - rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接