JAVA生成ORC格式文件

news2024/11/17 13:18:53

一、背景

由于需要用到用java生成hdfs文件并上传到指定目录中,在Hive中即可查询到数据,基于此背景,开发此工具类

ORC官方网站:https://orc.apache.org/

二、支持数据类型

image.png

三、工具开发

package com.xx.util;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import org.apache.orc.OrcFile;
import org.apache.orc.TypeDescription;
import org.apache.orc.Writer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class ORCUtil {

    /**
     * 将JSON数据转换成ORC文件并上传到HDFS中
     *
     * @param source json串,必须是和数据表顺序一致的json串
     * @param dbFields 存在数据库中的Hive表元数据字段
     * @param target 目标文件路径,包含文件名和.orc后缀
     * @throws IOException
     */
    public static void write(String source, List<String> dbFields, String target) throws IOException {
        long start = System.currentTimeMillis();
        Configuration conf = new Configuration();
        TypeDescription schema = TypeDescription.createStruct();
        JSONArray datas = JSONArray.parseArray(source);
        ArrayList<String> keys = new ArrayList<>(datas.getJSONObject(0).keySet());
        for (String flied : dbFields) {
            schema.addField(flied, TypeDescription.createString());
        }
        Writer writer = OrcFile.createWriter(new Path(target),
                OrcFile.writerOptions(conf)
                        .setSchema(schema).stripeSize(67108864)
                        .bufferSize(64 * 1024)
                        .blockSize(128 * 1024 * 1024)
                        .rowIndexStride(10000)
                        .blockPadding(true));
        VectorizedRowBatch batch = schema.createRowBatch();
        ArrayList<BytesColumnVector> bytesColumnVectors = new ArrayList<>();
        for (int i = 0; i < batch.numCols; i++) {
            bytesColumnVectors.add((BytesColumnVector) batch.cols[i]);
        }
        for (Object data : datas) { 
            JSONObject dataObj = (JSONObject) data;
            int row = batch.size++; 
            for (int i = 0; i < dbFields.size(); i++) {
//                数据对象上的字段
                if(keys.contains(dbFields.get(i))){
                    bytesColumnVectors.get(i).setVal(row, dataObj.getString(dbFields.get(i)).getBytes());
                }else{
                    bytesColumnVectors.get(i).setVal(row, "".getBytes());
                }
            }
        }

        long stop = System.currentTimeMillis();
        log.info("将json转换为orc文件花费的时间是 " + (stop - start) / 1000 + "秒");
        if (batch.size != 0) {
            writer.addRowBatch(batch);
            batch.reset();
        }
        writer.close();
    }
}

四、总结

基于此可以根据实际业务场景可以生成数据并上传到HDFS上提供Hive查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安防视频监控平台EasyCVR出现视频流播放卡顿情况,如何优化?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

成都股票开户选择哪家证券公司开户最便宜?炒股开户佣金最低是多少?

成都股票开户选择哪家证券公司开户最便宜&#xff1f;炒股开户佣金最低是多少&#xff1f; 股票开户是指向证券公司注册开立证券账户&#xff0c;以便购买和销售股票。一般而言&#xff0c;股票开户需要提供身份证明、联系方式、银行账户等信息并完成相应的申请手续。开户后&a…

postman请求400错误-日期LocalData

错误日志参考 [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type java.lang.String to required type java.time.LocalDate; neste…

RK3568驱动模块编译进内核

一、创建文件 首先在drivers/char目录下创建hello文件夹&#xff0c;然后在hello文件夹下创建hello.c 文件、Kconfig和Makefile文件。   hello.c 文件内容如下 #include <linux/module.h> #include <linux/kernel.h> static int __init helloworld_init(void) …

Shell 一键替换当前目录下所有文件的指定内容

文件内容&#xff1a; 脚本&#xff1a; #!/bin/bash source_content"127.0.0.1" target_content"helo cloudmusic"# 指定目录 directorypwd# 使用循环遍历目录中的每个文件 for file in "$directory"/* doif [ -f "$file" ]; then# …

B站狂转清华大佬手写笔记:Spring Security+ OAuth2.0分布式认证授权

微服务认证方案 微服务认证方案目前有很多种&#xff0c;每个企业也是大不相同&#xff0c;但是总体分为两类&#xff0c;如下&#xff1a; 网关只负责转发请求&#xff0c;认证鉴权交给每个微服务商控制统一在网关层面认证鉴权&#xff0c;微服务只负责业务 你们公司目前用…

保姆级教程:百度AI简单使用

1.进入AI对话界面 随便提个问题 这里我选择了程序猿小助手 文心一言网站 https://yiyan.baidu.com/welcome 文心一言可以做什么 与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。 参考截图

SSO身份验证如何帮助加强密码安全性

单点登录 &#xff08;SSO&#xff09; 是一种身份验证服务&#xff0c;可帮助用户使用一组凭据快速安全地访问所有应用程序。在员工需要访问多个应用程序才能完成工作的企业环境中&#xff0c;每次需要访问时都必须为每个应用程序输入登录凭据&#xff0c;这是一个主要的烦恼来…

C语言求 sinh(x)=(e^x - e^-x)/2,其中 e^x 用单独函数返回值

完整代码&#xff1a; // 求 sinh(x)(e^x - e^-x)/2&#xff0c;其中 e^x 用单独函数返回值 #include<stdio.h> #include<math.h>int main(){double x,sinh;printf("请输入一个数");scanf("%lf",&x);sinh(exp(x)-exp(-x))/2;printf("…

微信扫码跳转到小程序内部,浏览器扫码跳转到App 内部,如果手机上没有安装App ,跳转到下载页

第一:微信扫普通二维码跳转到小程序 第一步:登录微信公众平台,左侧点击开发管理,点击开发设置,滑到最下边,找到扫普通链接二维码打开小程序,配置对应的二维码链接,注意要拿这个链接去生成二维码,这样微信扫码才能跳转到小程序内部,还有那个校验文件,让后台放到对应的文件夹下,…

Elasticsearch基础篇(五):创建es索引并学习分析器、过滤器、分词器的作用和配置

创建es索引并学习分析器、过滤器、分词器的作用和配置 一、基础概念Elasticsearch与MySQL的类比1. ES与MySQL的结构类比图2. ES与MySQL的类比示意表格3. 索引中重要概念索引&#xff08;Index&#xff09;文档&#xff08;Document&#xff09;字段&#xff08;Field&#xff0…

值类型引用类型区别

例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Demo2 {internal class Program{static void Main(string[] args){#region 值类型int a 1;int b a;b 2;Console.WriteLine("a&…

【微信小程序调试工具试用】

【微信小程序调试工具试用】 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09;本次工具分享到此结束 什么是爬虫逆向&#xff1f; 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09; 1 如图 下面小程序…

c语言练习92:链表的中间结点

链表的中间结点 链表的结点为空时无法访问其next成员否则会报错 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode* middleNode(struct ListNode* head){if(h…

【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程

【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程 文章目录 【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程前言确定版本对应关系源码编译安装tiny-cuda-nn总结 前言 本人windows10下使用【Instant Neural Surface Reconstruction】算法时需要…

PositiveSSL的泛域名SSL证书

PositiveSSL是Sectigo旗下的一个子品牌&#xff0c;致力于为全球用户提供优质、高效的SSL证书服务。PositiveSSL以Sectigo强大的品牌影响力和全球网络为基础&#xff0c;秉承“安全、可靠、高效”的服务理念&#xff0c;为各类网站提供全面的SSL证书解决方案。今天就随SSL盾小编…

苹果官网上架新款Apple Pencil(USB-C)

昨天晚上苹果在其官网发布了新款Apple Pencil手写笔&#xff0c;苹果将该产品命名为 Apple Pencil&#xff08;USB-C&#xff09;&#xff0c;新款Apple Pencil采用了全新的USB-C接口&#xff0c;支持USB-C充电&#xff0c;兼容所有配备USB-C接口的iPad机型&#xff0c;售价为6…

Windows中安装tree命令

1、tree命令下载 下载地址&#xff1a;http://gnuwin32.sourceforge.net/packages/tree.htm&#xff1b; 2、tree命令安装 将tree命令添加到环境变量PATH中指定的路径下&#xff0c;可参考博客&#xff1a;《Windows中安装GCC详细教程》&#xff1b;

Android SurfaceControlViewHost介绍及使用

概要介绍 SurfaceControlViewHost是一个工具类&#xff0c; 用于帮助在其他进程中显示本进程的view。 SurfaceControlViewHost 为绘制进程持有&#xff0c;其中的SurfacePackage 交给另外的显示进程&#xff0c;在显示进程中的SurfaceView中通过SurfaceView.setChildSurface…