byzer-org/byzer-lang

Byzer 支持存储为 txt 格式的文件

smallTank007 opened this issue · 2 comments

需要支持将byzer引擎处理的数据通过save语法保存成text文件,并支持将text文件load进byzer引擎。支持的参数包括:是否包含表头,指定分隔符,指定逃逸字符,指定字符编码。

需求整理

当前 Byzer 是无法支持 Save 为 txt 为后缀的文件格式,从该需求来看,实际上想要存储的是一个 csv 文件,并且能够定义一些参数比如

  • 表头: header, 默认 false
  • 分隔符: sep, 默认为 ,
  • 逃逸字符: 'escape, 默认为 `
  • 字符编码: encoding, 默认为 UTF-8

参数详情可参考文档 CSV Files

基于 Byzer(Spark)的原理,任何存储的文件,都会遵守大数据分布式体系下的标准,比如存储 table_a 以 csv 的格式上存储至路径 /tmp/saved_data/table_a.csv, 实际上在执行存储时,会将 /tmp/saved_data/table_a.csv 存储为一个路径,实际上数据文件会以分片的方式存储在该目录下,并不会table_a 存储为 /tmp/saved_data/ 目录下的 table.csv 文件。

存储之后 /tmp/saved_data/table_a.csv 路径下会以类似的方式进行组织数据分片, 每个分片有 table_a 的部分数据

_SUCCESS
part-00000-1056a538-99af-4441-8928-12c5701df9c0-c000.csv
part-00001-1056a538-99af-4441-8928-12c5701df9c0-c000.csv
part-00002-1056a538-99af-4441-8928-12c5701df9c0-c000.csv

问题

用户希望将表生成 txt 后缀的文件(而实际从需求看,就是一个 csv 文本), 这里问题是,这里对 txt 文件的需求是什么:

  • 下游消费这些 txt 文件的是人还是程序或者代码?
  • 真正需要的是数据分片文件以 txt 结尾,还是需要一个单一的 txt 文件?
  • csv 后缀为什么不满足需求?

从产品的需求来讲,希望的路径是,用户在基于 Byzer 引擎做的上层产品界面上提供下载数据文件的能力,用户可以手动的通过填入表单的方式进行一些参数的定义和填写,最后可以将单一的文件存储至

由于面向的用户群体使用的工具链的原因,他们更 prefer 以 txt 为结尾的文件类型。

这里从技术实现的角度,建议在产品侧的“下载”能力上,实现方案如下:

  1. 表单中的分隔符,逃逸字符等参数等,可以直接通过 save csv 作为数据源生成正确的 csv 文件路径,作为临时路径
  2. 对上述步骤生成的数据路径做文件的合并,然后提供前端用户传进来的表单的后缀名,对合并的文件进行 rename
  3. 生成之后对临时路径进行删除即可
  4. 以流的方式提供下载