竞赛快开始了啊,今晚6点就要提交。题目如下:
1、文本文件【订单.txt】中有约500万条订单数据,格式为Json或Xml(二选一)。
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、语言不限,可用Delphi、Java、Python、Go等语言。
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分钟。
不知道能不能拿奖
相关推荐
在Oracle数据库中,处理JSON数据已经变得越来越常见,特别是在现代应用程序和数据分析中。Oracle提供了强大的JSON支持,使得我们可以方便地存储、查询和格式化查看JSON数据。本文将深入探讨如何在Oracle环境中格式化...
在Oracle中,处理JSON字符串涉及到解析、查询、更新和存储JSON数据。本篇文章将深入探讨Oracle对JSON字符串的处理实例。 首先,Oracle 12c及更高版本引入了JSON相关的数据类型和函数,如`JSON_OBJECT`和`JSON_ARRAY...
oracle数据库的json解析包, 前端数据通过json格式传送到oracle, 接收后, 通过jo := json(p_param); jo := json(p_param); 等json all内置函数实现, 任何正规的json都能解析!
在实际开发中,有时我们需要将JSON数据导入到Excel,或者将Excel数据导出为JSON,以便进行数据交换或分析。`JxonExcel`是一个专门用于处理这种转换的第三方类库。 `JxonExcel`库提供了方便的方法来实现JSON与Excel...
PL/JSON是Oracle数据库中用于处理JSON(JavaScript Object Notation)数据的一个开源工具包,它在Oracle环境中提供了方便的JSON操作功能。1.05版是这个包的更新版本,相较于1.04版,它可能包含了一些修复、优化或者...
为您提供JsonToOracle Json导入Oracle软件下载,JsonToOracle是一款Json导入Oracle软件,具有配置简单、支持向导、支持批量导入、支持命令行、支持计划任务执行等...使用方法 导入JSON数据到Oracle的向导 单击“任务
要使用JSONJar包,你需要将其加载到Oracle数据库的Java全局区域(Java Global Area, JGA)中,并确保数据库服务器有权访问和执行其中的类。 加载JSONJar包的步骤如下: 1. 将JSONJar包上传到Oracle数据库服务器的一...
采用pb11.5 + pbni + vs2015 + rapidjson的开源库,生成解析json,支持datawindow快速导入导出字段名有大写字母的json(dw的字段名全为小写字母,可在column属性的tag设置),支持dw导出json时对指定字段进行des加密...
标题“导入eclipse的json包”意味着我们将讨论如何将`org.json`包导入到Eclipse项目中,以便在Java代码中使用它来解析和生成JSON数据。`org.json`提供了一系列的类和方法,如`JSONObject`、`JSONArray`、`JSONString...
采用pb11.5 + pbni + vs2015 + rapidjson的开源库,生成解析json,支持datawindow快速导入导出字段名有大写字母的json,支持dw导入出json时对指定字段进行des加密,并在导入到dw时时进行des解密,修改了pbvm115.dll...
采用pb11.5 + pbni + vs2015 + rapidjson的开源库,生成解析json,支持datawindow快速导入导出字段名有大写字母的json(dw的字段名全为小写字母,可在column属性的tag设置),支持dw导出json时对指定字段进行des加密...
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 Database 12c 第2版(版本12.2)引入了一系列SQL/JSON函数,为数据库开发者提供了处理JSON数据的强大工具。这些函数允许用户直接在数据库层面上操作JSON文档,而无需在应用层面进行转换处理,极大地提高了...
在Windows Presentation Foundation(WPF)应用开发中,有时我们需要处理来自JSON格式的数据,并将其导入到数据库中进行存储和处理。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于...
在Oracle数据库中,JSON(JavaScript Object Notation)已经成为处理复杂数据结构的重要工具,尤其是在Web服务和数据交换场景中。Oracle提供了强大的JSON支持,包括JSON数据类型、函数和过程,使得在PL/SQL环境中...
在Oracle数据库中,处理JSON数据已经成为常见的需求。在标题和描述中提到的,我们需要通过SQL语句从存储在数据库字段中的JSON字符串中提取特定属性的值。Oracle提供了多种方法来处理这种需求,其中包括基础的字符串...
本教程将详细讲解如何在Idea中使用Java解析JSON文件,并将数据有效地导入到MySQL数据库。 首先,我们需要理解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器...
要处理JSON格式的数据,你需要导入相应的库,其中最常用的便是`json-lib`。在导入JSON包时,可能会遇到一些问题,本文将详细讲解这些问题以及如何解决。 首先,我们来看一下在导入json包时可能需要的依赖jar包: 1...
本资源包含的是"java使用Json所需要导入的所有jar包",确保了你在处理JSON数据时所需的全部依赖。 首先,最重要的库是`json.org`提供的`org.json`库,它包含了`json.jar`。这个库提供了一个简单的API,可以方便地将...
2. SQL中的JSON处理功能:Oracle 12c提供了一系列的SQL函数和操作符来处理JSON文档,包括读取JSON文档内容的函数(如JSON_VALUE,JSON_QUERY),用来检查JSON文档中是否存在某个元素的函数(如JSON_EXISTS),以及...