【问题标题】:Spark SQL in Databricks: How to extract names from tables that have similar names?Databricks 中的 Spark SQL:如何从具有相似名称的表中提取名称?
【发布时间】:2022-06-13 05:21:56
【问题描述】:

我有以下表格:

Table_A     Table_B    Table_C   List_A

表_A:

Column_A    Column_B     Column_C

表_B:

Column_A    Column_B     Column_C

表_C:

Column_A    Column_B     Column_C

列表_A:

Line_D      Line_E       Line_F

我想从具有相似名称的表中选择所有列。在此示例中,它们是 Table_A, Table_B, Table_C。他们的名字以“Table_”开头。

怎么做?

【问题讨论】:

  • 纯粹在 SQL 中,你不能。您需要编写代码来收集表列表,然后编写代码来编写将表联合在一起的 SQL。
  • @MatBailie 我不能写像select * from tables where tables like 'Table_%' 这样的东西?我期待这种事情。
  • SQL 是强静态类型的。这些表可能有不同的列名、不同的数据类型等。作为程序员,您必须处理所有这些。此外,SQL 是结构化查询语言,它是用于结构化数据的,它的名字。如果您事先知道要组合哪些表,请编写一个使用 UNION ALL 组合表的视图。如果你事先不知道,你使用的是半结构化数据,需要编写代码来处理后果。
  • 有成千上万的表具有相似的名称。不可能硬编码应该包含哪些表。但是如果它们有相同的列名呢?
  • 根据我的第一条评论,您不能仅在 SQL 中执行此操作。您需要编写查询表列表的代码,然后编写新的 SQL(称为动态 SQL),然后运行以编程方式生成的 SQL。您的 SQL 运行情况如何?

标签: sql apache-spark apache-spark-sql databricks


【解决方案1】:

具有相似名称的表 - 它们是:

  • 都以Table_开头?
  • 都以长度为 5 的相同前缀开头?
  • 都以相同的前缀后跟下划线开头?

考虑像Table_ATablerone_BTable_bable_CTable_D_D 这样的表名 - 是否相似...?

使用 SQL,您可以使用 SHOW TABLES 获取表列表,但无法在子查询中运行它,因此您无法使用 SQL 进一步处理它。但是你可以使用 Scala 或 Python。

spark.sql("show tables").select("tableName").as[String].collect.groupBy(_.split("_")(0))

这将返回Map(list -> Array(list_a), table -> Array(table_a, table_b, table_c))

然后您可以通过迭代上述结果并运行DESCRIBE <table_name> 来获取列名 - 您需要再次考虑您想要获取的内容(所有列名?共享列名?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多