文件结合(JOIN)

JOIN
复数文件结合后可以抽取的功能。

FOCUS的JOIN           FOCUS/DBのJOIN
RDBMS的JOIN           SQL TABLE的JOIN、OPTIMIZATION ON、AFDのKEYS=1以上、MULTIPATH JOIN不可

JOIN的规则、是以TO文件的SUFFIX属性来决定的。


TO文件结合字段
FOCUS                        INDEX指定必要、1个子段也可结合
SQL TABLE                 INDEX指定不要、可以结合复数字段

JOIN [INNER|LEFT_OUTER] FROM字段1 [AND FROM字段2...] [WITH FROM字段] IN FROM文件 [TAG FROMTAG]
  TO [UNIQUE|MULTIPLE] TO字段1 [AND TO字段2...] IN TO文件 [TAG TOTAG] AS JOIN名
END

JOIN的种类
JOIN有INNER JOIN和OUTER JOIN两种。
INNER                         JOINJOIN指定字段一致的数据抽取
OUTER                        JOINFROM文件的数据和JOIN指定字段一致的数据抽取

 

各种组合(INNER JOIN or OUTER JOIN)
 JOIN文件SET ALLJOIN KEY的关系UNIQUE/MULTIPLE
INNER JOINFOCUS-FOCUSOFF1:NMULTIPLE
  ON1:N[MULTIPLE]
 RDB-RDBOFF1:1[UNIQUE]
  OFF1:N[MULTIPLE]
OUTER JOINFOCUS-FOCUSON/OFF1:1[UNIQUE]
  ON1:NMULTIPLE
 RDB-RDBON1:1[UNIQUE]
  ON1:N[MULTIPLE]

 数据例

MINGBU(INNER)

工号
7010011
7111689
7115025
7124984
7211875
7222166
7315843
7316019
7316105
7316514

YINGYE(INNER)

营业工号

商品代码

数量

7111689

CM200

100

7111689

TV650

150

7111689

VH500

200

7315843

CM200

500

7315843

SN300

350

7316514

VH500

300

[INNER JOIN]

SET ALL = OFF
JOIN [INNER] 工号 IN MINGBU TO MULTIPLE 营业工号 IN YINGYE AS J1.


工号营业工号商品代码数量
71116897111689CM200100
71116897111689TV650150
71116897111689VH500200
73158437315843CM200500
73158437315843SN300350
73165147316514VH500300

[OUTER JOIN]

SET ALL = ON
JOIN LEFT_OUTER 工号 IN MINGBU TO MULTIPLE 营业工号 IN YINGYE AS J1.


工号营业工号商品代码数量
7010011
71116897111689CM200100
71116897111689TV650150
71116897111689VH500200
7115025
7124984
7211875
7222166
73158437315843CM200500
73158437315843SN300350
7316019
7316105
73165147316514VH500300

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一种使用ForkJoin框架和RandomAccessFile实现对大文件的分任务复制的方法。 1. 首先,我们需要创建一个ForkJoin任务类,用于实现对文件的分任务复制。此任务类需要继承ForkJoinTask类,并实现compute方法。具体实现如下: ```java public class FileCopyTask extends ForkJoinTask<Void> { private static final int THRESHOLD = 1024 * 1024; // 每个任务最多复制 1MB private String srcPath; // 源文件路径 private String dstPath; // 目标文件路径 private long start; // 当前任务开始复制的位置 private long end; // 当前任务结束复制的位置 public FileCopyTask(String srcPath, String dstPath, long start, long end) { this.srcPath = srcPath; this.dstPath = dstPath; this.start = start; this.end = end; } @Override public Void compute() { try (RandomAccessFile srcFile = new RandomAccessFile(srcPath, "r"); RandomAccessFile dstFile = new RandomAccessFile(dstPath, "rw")) { srcFile.seek(start); dstFile.seek(start); byte[] buffer = new byte[THRESHOLD]; long remaining = end - start; while (remaining > 0) { int n = srcFile.read(buffer, 0, (int) Math.min(buffer.length, remaining)); if (n <= 0) { break; } dstFile.write(buffer, 0, n); remaining -= n; } } catch (IOException e) { e.printStackTrace(); } return null; } @Override public boolean exec() { compute(); return true; } } ``` 2. 接下来,我们需要创建一个ForkJoinPool,并提交任务到该池中。具体实现如下: ```java public class FileCopy { public static void copy(String srcPath, String dstPath) throws IOException { long fileSize = new File(srcPath).length(); ForkJoinPool pool = new ForkJoinPool(); FileCopyTask task = new FileCopyTask(srcPath, dstPath, 0, fileSize); pool.submit(task); task.join(); // 等待任务完成 pool.shutdown(); // 关闭线程池 } } ``` 3. 最后,我们可以调用FileCopy.copy方法,实现对文件的分任务复制。具体使用方法如下: ```java public static void main(String[] args) throws IOException { FileCopy.copy("src.txt", "dst.txt"); } ``` 需要注意的是,在实际使用中,我们需要根据文件大小和计算机的性能,合理设置每个任务的大小和线程池的大小,以达到最优的复制速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值