`
huanghongqiao
  • 浏览: 1704 次
  • 性别: Icon_minigender_1
  • 来自: liuzhou
最近访客 更多访客>>
社区版块
存档分类
最新评论

快速导入500万行JSON到Oracle

 
阅读更多

 竞赛快开始了啊,今晚6点就要提交。题目如下:

1、文本文件【订单.txt】中有约500万条订单数据,格式为JsonXml(二选一)

2、订单数据项:OrderID(订单ID)OrderNo(订单编号)

3、订单数据中的订单编号可能会有重复,将不重复的数据导入到TAB_ORDER表中,重复数据导入到TAB_ORDER_DUP表中。

 

示例:

源数据:

OrderID

OrderNO

1

0000001

2

0000002

3

0000002

4

0000003

 

结果数据:

TAB_ORDER表数据:

OrderID

OrderNO

1

0000001

2

0000002

4

0000003

TAB_ORDER_DUP表数据:

OrderID

OrderNO

3

0000002

竞赛规则

1、语言不限,可用DelphiJavaPythonGo等语言。

2、以系统完成任务执行时间排序,执行时间最短者第一名,依次类推。

 

======================================================================

500万行的JSON内容大概如下:

ID_IT00000003471021,IT000003471020
ID_IT00000003565873,IT000003565871

======================================================================

我的思路如下:解析JSON文件为CSV文件,再利用ORACLE客户端自带的SQLLDR导入,代码如下,边百度边写GO代码,还好以前学过一些。

 

package main

import (
	"fmt"
	"bufio"
	"io"
	"os"
	"github.com/json-iterator/go"
	"strconv"
	"os/exec"
	"time"
)

type Order struct {
	OrderID  string
	OrderNo string
}

func work(idx int, c chan int) {
    params := fmt.Sprintf("m_mk/oracle@1.3.221.239:1528/orclutf8 control=ctrl/a%d.ctl parallel=true", idx)
    cmd := exec.Command("BIN/sqlldr.exe ", params)
    if err := cmd.Run(); err != nil {
        fmt.Println("Error: 导入data" + strconv.Itoa(idx) + "失败")
    } 
   c <- 1
}

func work_dup(c chan int) {
    cmd := exec.Command("BIN/sqlldr.exe ", "m_mk/oracle@1.3.221.239:1528/orclutf8 control=ctrl/a_dup.ctl parallel=true")
    if err := cmd.Run(); err != nil {
        fmt.Println("Error: 导入data_dup失败")
    } 
	c <- 1
}

func main() {
    inputFile, inputError := os.Open("data.json")
	if inputError != nil {
		fmt.Println("Open file error!")
		return
	}
	
	defer inputFile.Close()
	
	inputReader := bufio.NewReader(inputFile)
	
	var order Order
 	m := make(map[string]int,5000000)
	file_group := make(map[string]int,20)
	i , j := 1, 0
	
	wf, _ := os.OpenFile("./data/"+ "data_" + strconv.Itoa(i) + ".csv", os.O_CREATE|os.O_WRONLY | os.O_TRUNC, 0666)
	writer := bufio.NewWriter(wf)
	file_group["data/"+ "data_" + strconv.Itoa(i) + ".csv"] = i
	
	wf_dup, _ := os.OpenFile("./data/data_dup.csv", os.O_CREATE|os.O_WRONLY, 0666)
	writer_dup := bufio.NewWriter(wf_dup)
	
    start := time.Now()
	for {
	    inputString, readerError := inputReader.ReadString('\n')
	    if readerError == io.EOF {
			break
		}
	    var json_iterator = jsoniter.ConfigCompatibleWithStandardLibrary
        json_iterator.Unmarshal([]byte(inputString), &order)
		
		if _, ok := m[order.OrderNo]; ok {
			writer_dup.WriteString(fmt.Sprintf("%s,%s\n", order.OrderID, order.OrderNo))
		} else {
		    m[order.OrderNo] = 1
		    writer.WriteString(fmt.Sprintf("%s,%s\n", order.OrderID, order.OrderNo))
			j = j + 1
		}
		
		if j >= 500000 {
		  j, i = 0, i + 1

		  writer.Flush()
          wf.Close()
		  
		  wf, _ = os.OpenFile("./data/"+ "data_" + strconv.Itoa(i) + ".csv", os.O_CREATE|os.O_WRONLY | os.O_TRUNC, 0666)
	      writer = bufio.NewWriter(wf)
		  file_group["data/"+ "data_" + strconv.Itoa(i) + ".csv"] = i
		}
		

	}
	writer.Flush()
    wf.Close()
 
	writer_dup.Flush();
	wf_dup.Close()
 
	file_group["data/data_dup.csv"] = -1
	doneChannel := make(chan int, len(file_group)) 
	for _, v := range file_group {
		if v == -1 {
			go work_dup(doneChannel)
		} else {
			go work(v, doneChannel)
		}
	}
	
    for i := 0; i < len(file_group); i++{
        <-doneChannel
    }
	
    end := time.Since(start)
	
	fmt.Println("导入完成,供耗时 " ,end, "毫秒")
	
	var age byte
	fmt.Scanln(&age)
	fmt.Scanln(&age)
	fmt.Scanln(&age)

}


//sqlldr TEST/TEST@192.168.10.27:1522/oracle control=a1.ctl direct=y parallel=true
 

 
SQLLDR 导入文件如下:



 

先创建了21个CTL文件,代码都省了,红色圈圈的内容要对应切割后的文件名。

 

运行结果如下:



 

因为有个文件我之前手动导入过了,所以再次导入失败。总共耗时约8分钟。

哭不知道能不能拿奖

  • 大小: 3.6 KB
  • 大小: 23.1 KB
分享到:
评论

相关推荐

    oracle格式化查看json数据

    在Oracle数据库中,处理JSON数据已经变得越来越常见,特别是在现代应用程序和数据分析中。Oracle提供了强大的JSON支持,使得我们可以方便地存储、查询和格式化查看JSON数据。本文将深入探讨如何在Oracle环境中格式化...

    Oracle JSON 字符串处理实例

    在Oracle中,处理JSON字符串涉及到解析、查询、更新和存储JSON数据。本篇文章将深入探讨Oracle对JSON字符串的处理实例。 首先,Oracle 12c及更高版本引入了JSON相关的数据类型和函数,如`JSON_OBJECT`和`JSON_ARRAY...

    oracle json包

    oracle数据库的json解析包, 前端数据通过json格式传送到oracle, 接收后, 通过jo := json(p_param); jo := json(p_param); 等json all内置函数实现, 任何正规的json都能解析!

    Json-Excel导入导出

    在实际开发中,有时我们需要将JSON数据导入到Excel,或者将Excel数据导出为JSON,以便进行数据交换或分析。`JxonExcel`是一个专门用于处理这种转换的第三方类库。 `JxonExcel`库提供了方便的方法来实现JSON与Excel...

    PL/JSON,oracle的json包,1.05版

    PL/JSON是Oracle数据库中用于处理JSON(JavaScript Object Notation)数据的一个开源工具包,它在Oracle环境中提供了方便的JSON操作功能。1.05版是这个包的更新版本,相较于1.04版,它可能包含了一些修复、优化或者...

    JsonToOracle Json导入Oracle软件 v2.0官方版

    为您提供JsonToOracle Json导入Oracle软件下载,JsonToOracle是一款Json导入Oracle软件,具有配置简单、支持向导、支持批量导入、支持命令行、支持计划任务执行等...使用方法 导入JSON数据到Oracle的向导 单击“任务

    Oracle对JSON处理函数Jar包

    要使用JSONJar包,你需要将其加载到Oracle数据库的Java全局区域(Java Global Area, JGA)中,并确保数据库服务器有权访问和执行其中的类。 加载JSONJar包的步骤如下: 1. 将JSONJar包上传到Oracle数据库服务器的一...

    pb json 生成、解析,dw导入导出json(20211208更新)

    采用pb11.5 + pbni + vs2015 + rapidjson的开源库,生成解析json,支持datawindow快速导入导出字段名有大写字母的json(dw的字段名全为小写字母,可在column属性的tag设置),支持dw导出json时对指定字段进行des加密...

    导入eclipse的json包

    标题“导入eclipse的json包”意味着我们将讨论如何将`org.json`包导入到Eclipse项目中,以便在Java代码中使用它来解析和生成JSON数据。`org.json`提供了一系列的类和方法,如`JSONObject`、`JSONArray`、`JSONString...

    pb json 生成、解析,dw导入导出json,select-sql转json(20240904更新)

    采用pb11.5 + pbni + vs2015 + rapidjson的开源库,生成解析json,支持datawindow快速导入导出字段名有大写字母的json,支持dw导入出json时对指定字段进行des加密,并在导入到dw时时进行des解密,修改了pbvm115.dll...

    pb json 生成、解析,dw导入导出json

    采用pb11.5 + pbni + vs2015 + rapidjson的开源库,生成解析json,支持datawindow快速导入导出字段名有大写字母的json(dw的字段名全为小写字母,可在column属性的tag设置),支持dw导出json时对指定字段进行des加密...

    Flume 抽取MYSQL Oracle数据 JSON格式 推送Kafka

    Flume二次开发,支持抽取MYSQL Oracle数据库数据 以JSON格式推送至Kafka。 demo: sql_json.sources.sql_source.type = com.hbn.rdb.source.SQLSource sql_json.sources.sql_source.connectionurl = jdbc:oracle:...

    Oracle中引入的JSON函数.pdf

    Oracle Database 12c 第2版(版本12.2)引入了一系列SQL/JSON函数,为数据库开发者提供了处理JSON数据的强大工具。这些函数允许用户直接在数据库层面上操作JSON文档,而无需在应用层面进行转换处理,极大地提高了...

    WPF 导入JSON数据

    在Windows Presentation Foundation(WPF)应用开发中,有时我们需要处理来自JSON格式的数据,并将其导入到数据库中进行存储和处理。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于...

    Oracle Json常用方法封装

    在Oracle数据库中,JSON(JavaScript Object Notation)已经成为处理复杂数据结构的重要工具,尤其是在Web服务和数据交换场景中。Oracle提供了强大的JSON支持,包括JSON数据类型、函数和过程,使得在PL/SQL环境中...

    Oracle 获取JSON字符串对象的属性值

    在Oracle数据库中,处理JSON数据已经成为常见的需求。在标题和描述中提到的,我们需要通过SQL语句从存储在数据库字段中的JSON字符串中提取特定属性的值。Oracle提供了多种方法来处理这种需求,其中包括基础的字符串...

    idea Java 解析json文件并导入mysql数据库

    本教程将详细讲解如何在Idea中使用Java解析JSON文件,并将数据有效地导入到MySQL数据库。 首先,我们需要理解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器...

    导入json包的一些注意

    要处理JSON格式的数据,你需要导入相应的库,其中最常用的便是`json-lib`。在导入JSON包时,可能会遇到一些问题,本文将详细讲解这些问题以及如何解决。 首先,我们来看一下在导入json包时可能需要的依赖jar包: 1...

    java使用Json所需要导入的所有jar包

    本资源包含的是"java使用Json所需要导入的所有jar包",确保了你在处理JSON数据时所需的全部依赖。 首先,最重要的库是`json.org`提供的`org.json`库,它包含了`json.jar`。这个库提供了一个简单的API,可以方便地将...

    Oracle 12c json-developers-guide.pdf

    2. SQL中的JSON处理功能:Oracle 12c提供了一系列的SQL函数和操作符来处理JSON文档,包括读取JSON文档内容的函数(如JSON_VALUE,JSON_QUERY),用来检查JSON文档中是否存在某个元素的函数(如JSON_EXISTS),以及...

Global site tag (gtag.js) - Google Analytics