在具有可变列的csv文件集合上公开sql接口

inn6fuwd  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(277)

我对hadoop比较陌生,了解到可能有数百种方法和工具来解决任何给定的问题。我正在寻找一个人来引导我通过普遍接受的最佳实践方法来解决一个问题,我希望这是一个相对常见的情况我。
我有一些csv文件是从一个进程,我不控制生成。csv文件是相关的,但是每个csv文件中可能有一组不同的列。我提供了下面两个文件的一个虚构的例子,在现实生活中,将有成千上万的文件和潜在的数千列。
文件1


# COL1, COL3, COL4

a1, c1, d1
a2,,d2
a3,c3,d3

文件2


# COL1, COL2, COL4

a1, b1, d6
a5, b5,
a3,,

最后,我想在这些数据上公开某种可通过sql/jdbc访问的表格视图,其理论结构如下:


# COL1, COL2, COL3, COL4

a1,,c1,d1
a1,b1,,d6
a3,,c3,d3
a3,c3,,
a5,b5,,

关键点是:
我想一个简单的过程,能够更新可用的列作为新的发现在较新的文件。
如果用户希望在所有文件中的所有列的列表都是数千列的情况下同时只分析或处理10-20列,那么我不想因为性能而受到惩罚。

mrfwxfqh

mrfwxfqh1#

这可能只是一个部分的答案,但我至少可以解决您的数据结构。如果您希望在sql数据库中存储可变大小的数据(不管dbms是什么),您可能需要类似的结构。。。
补充说明:我主要将以下内容用作传入数据的“暂存阶段”。应该有一个最终的数据库/模式,其中包含存储最终产品或经过净化的最终数据形式的表。这些表只能用于将数据导入系统。在那里,我将拥有一些过程(自动化或其他),这些过程将这些临时数据复制或移动到最终的表中,同时对其进行清理、规范化和全面的清理和验证。这一思想并不是一个完整的解决方案,而是解决输入数据变结构问题的一种方法。
您需要一个用于指定列名的主“列查找”表。我们称之为, column_names :

CREATE TABLE column_names 
 (
  c_id INT,
  c_name VARCHAR(20),
  c_size INT
 );

数据示例如下:

c_int   | c_name   | c_size
==============================
 1       | col1     | 10
 2       | col2     | 5
 3       | col3     | 20
 4       | f_name   | 25
 5       | l_name   | 25

如果您愿意,我们可以添加更多的字段,以便在字段定义中提供更高的粒度(即数据类型、可为null的等),或者保持上面的状态以提供简单的通用结构。我们只是假设,并将所有传入的数据转换为string/varchar。这使得它现在更简单一点。
在此之后,您可能需要定义一些东西,我们称之为“导入会话”。

CREATE TABLE import_session 
 (
  session_id INT NOT NULL UNIQUE,
  create_date TIMESTAMP
 );

样本数据:

session_id   | create_date
=====================================
 11123        | 2015-02-15 15:33:21

同样,如果您需要的话,这可以变得更具体,但是上面的内容应该可以作为示例。
接下来,我们需要你的进口结构。这将允许重用可能常见的结构。我们就叫它吧 import_struct .

CREATE TABLE import_struct
 (
  struct_id INT
  c_id INT
 );

样本数据:

struct_id   | c_id   
=======================
 122         | 5
 122         | 4
 122         | 1
 122         | 2
 37          | 1
 37          | 2
 37          | 3

此示例包含两个结构:122和37。
最后,我们需要一个数据存储表

CREATE TABLE session_data
 (
  session_id INT,
  struct_id INT,
  session_recid INT,
  c_id INT,
  c_data VARCHAR(1000)
 );

一个简单的数据导入可能如下所示:

session_id   | struct_id   | session_recid   | c_id   | c_data
=================================================================================
 11123        | 122         | 1               | 5      | Smith
 11123        | 122         | 1               | 4      | John
 11123        | 122         | 1               | 1      | 5551235555
 11123        | 122         | 1               | 2      | 90210
 11123        | 122         | 2               | 5      | Lincoln
 11123        | 122         | 2               | 4      | Abe
 11123        | 122         | 2               | 1      | 5551235511
 11123        | 122         | 2               | 2      | 90210
 11123        | 122         | 3               | 5      | Washington
 11123        | 122         | 3               | 4      | George
 11123        | 122         | 3               | 1      | 5551239999
 11123        | 122         | 3               | 2      | 90210

希望这个数据库的设计能让你朝着正确的方向努力。这只是构造数据的一种非常基本、非常通用的方法。如前几次所述,您可以在结构中获得更具体的内容,您还可以在其中添加更多的表,以使关系,从而使数据完整性,更健壮和更好的可扩展性。不过,这应该让你开始。

相关问题