我最近有一个需求,我需要生成Parquet文件,可以通过Apache Spark读取只使用Java(不使用额外的软件安装,如:Apache Drill,Hive,Spark等)。文件需要保存到S3,所以我将分享如何做到这两点的细节。
没有简单的指南来指导如何做到这一点。我也不是Java程序员,所以使用Maven,Hadoop等的概念对我来说都是陌生的。所以我花了将近两周的时间来完成这一工作。我想在下面分享我的个人指南,我是如何实现这一点的
我最近有一个需求,我需要生成Parquet文件,可以通过Apache Spark读取只使用Java(不使用额外的软件安装,如:Apache Drill,Hive,Spark等)。文件需要保存到S3,所以我将分享如何做到这两点的细节。
没有简单的指南来指导如何做到这一点。我也不是Java程序员,所以使用Maven,Hadoop等的概念对我来说都是陌生的。所以我花了将近两周的时间来完成这一工作。我想在下面分享我的个人指南,我是如何实现这一点的
2条答案
按热度按时间093gszye1#
选择:
我将使用NetBeans作为IDE。
关于Java中的 parquet 的一些信息(对于像我这样的新手来说):
先决条件:
你必须在运行Java代码的Windows机器上安装Hadoop。好消息是你不需要安装整个Hadoop软件,而只需要两个文件:
这些文件可以下载到here。对于这个例子,你需要2.8.1版本(由于parquet-avro 1.9.0)。
1.将这些文件复制到目标计算机上的C:\hadoop-2.8.1\bin。
1.添加一个名为HADOOP_HOME的新系统变量(不是用户变量),其值为C:\hadoop-2.8.1
x1c 0d1x的数据
1.修改SystemPath变量(不是user变量),并在末尾添加以下内容:%HADOOP_HOME%\bin
1.重新启动计算机以使更改生效。
如果这个配置没有正确完成,你将在运行时得到以下错误:
java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
编码入门:
首先创建一个新的空Maven项目,并添加parquet-avro 1.9.0和hadoop-aws 2.8.2作为依赖项:
![](https://i.stack.imgur.com/KXHFu.png)
创建你的主类,在那里你可以写一些代码
第一件事是你需要生成一个Schema。现在据我所知,你没有办法在运行时以编程方式生成一个Schema。Schema.Parserclass' parse() 方法只接受一个文件或一个字符串作为参数,并且一旦模式被创建,就不允许你修改它。为了避免这个问题,我在运行时生成我的模式JSON并解析它。是一个示例Schema:
字符串
Avro架构的详细信息可以在这里找到:https://avro.apache.org/docs/1.8.0/spec.html
型
fixed_len_byte_array
)。因此,我们在本例中也必须使用fixed(如图所示)在Java中,我们必须使用BigDecimal
来真正处理小数。我已经确定,无论值如何,Decimal(32,4)
都不会超过16个字节。因此,我们将使用标准字节。在我们下面的序列化中(以及上面的模式中),数组大小为16:型
型
型
为了方便起见,完整的源代码:
型
gorkyyrv2#
我花了一些时间研究这种方法,发现了一种使用DuckDB的替代方法,它在内存中创建一个表,并将其导出到一个parquet文件。
这就是我的工作!
字符串
代码示例(尽可能简单):
型
将文件复制到s3应该很容易,但是有一个built-in support in DuckDB as well。