代码之家  ›  专栏  ›  技术社区  ›  hotmeatballsoup

在启用多行的情况下将文本文件读取到Databricks表中

  •  1
  • hotmeatballsoup  · 技术社区  · 2 年前

    请注意: 我问了一个 similar question 昨天,但现在有了新的(进化的)需求,我在这里提出这个问题,作为我在Databricks/Spark中遇到的类似(但新的)问题的迭代。

    我有一堆文本文件(所有扩展名都是“.flib”)位于Azure存储容器上。我正试图将这些文件读取到Azure Databricks表中,该表有两列:(1) FileName 其包含从容器中读取的FLIP文件的名称,以及(2) FileData 其包含每个FLIB文件的所有文本。

    到目前为止,我的最佳尝试是:

    %sql
    USE CATALOG "data-beta";
    USE data_beta_dev;
    DROP TABLE IF EXISTS data_beta;
    CREATE TABLE data_beta 
    USING delta
    AS
    SELECT
      REVERSE(SUBSTRING_INDEX(REVERSE(_metadata.file_path), '/', 1)) as SouceFileName,
      value AS File_Data
    FROM read_files("wasbs://<redacted>@<redacted>.blob.core.windows.net/some/path/to/flibs/*.flib", format => 'text');
    
    select * from data_beta;
    

    虽然这是有效的,但它会产生不希望的结果,即每个FLIB文件的每一行都被放入 data_beta 桌子

    因此,如果有一个名为 hello.flib 在该容器上,并且该文件中包含150行文本,则上面的代码将在 数据贝塔 桌子每一行都有一个 FileName “hello.flib”的值,但将具有 文件数据 该FLIB文件中不同文本行的值。

    相反,我希望每个文件有1行。所以如果 你好.flib 包含150行,我仍然只得到该文件的1行,其中有一个巨大的数据块 文件数据 值(全部150行文本)。

    有人能看到我是如何做到这一点的吗?

    0 回复  |  直到 2 年前
        1
  •  2
  •   JayashankarGS    2 年前

    您可以使用 binaryFile 作为格式并对其进行解码。

    %sql
    DROP TABLE IF EXISTS flib_raw_data;
    CREATE TABLE flib_raw_data 
    USING delta
    AS
    SELECT
     REVERSE(SUBSTRING_INDEX(REVERSE(path), '/', 1)) as SouceFileName,
      decode(content,'utf-8') AS File_Data
    FROM read_files("wasbs://[email protected]/flibs/*flib",
        format => 'binaryFile')
    

    这里,路径是具有文件路径的列,内容是具有整个数据的列。

    输出

    SouceFileName 文件数据
    first.flib 随机词/jayashankar/ayajksdjcnsdklcd随机词/yayashankar/ayajksdjcensdklcds随机词/ja yashankar/ayajksdjcnsdklcds随意词/jaayashankar/yajksdJCNSdklcds随便词/jayamankar/ayajkSDJCnsdklc随意词/ja
    推荐文章