【问题标题】:Spark SQL - Get Column Names of a Hive Table in a StringSpark SQL - 获取字符串中 Hive 表的列名
【发布时间】:2020-10-20 11:41:31
【问题描述】:

我正在尝试以逗号分隔的字符串获取 Hive 表的列名。这就是我正在做的事情

val colNameDF = spark.sql("show columns in hive_table")
val colNameStr = colNameDF.select("col_name").collect.mkString(", ")

我得到的输出是

res0: String = [col_1], [col_2], [col_3]

但我想要的是col_1, col_2, col_3。我可以从字符串中删除[],但我很好奇我们是否可以首先获得不带括号的列名。

编辑: Hive 表中的列名不包含 [ ]

【问题讨论】:

  • 数据框的 printSchema 是什么?
  • @dumitru col_name : 字符串(可为空 = 假)
  • 你想用这些列做什么??
  • 您的方法不必要地触发了使用 .collect 函数获取元详细信息的 spark 作业,请检查我的方法不会触发任何作业,它将为您提供所需的元详细信息。有些人在不知道它是如何工作的情况下被否决了。 .
  • @Srinivas 是的,我试过你的方法,它也有效。我们应该有一个功能可以在投票时发表评论

标签: apache-spark hive apache-spark-sql


【解决方案1】:

代替show columns,试试下面的方法,因为它比你的更快。

val colNameDF = spark.sql("select * from hive_table").limit(0)

或者

val colNameDF = spark.table("hive_table").limit(0)
val colNameStr = colNameDF.columns.mkString(", ")

【讨论】:

    【解决方案2】:

    collect 返回给你一个Row 的数组,它在内部特别表示为值数组,所以你需要像这样欺骗它:

    val colNameDF = spark.sql("show columns in hive_table")
    val colNameStr = colNameDF.select("col_name").collect.map(r=>r.getString(0)).mkString(", ")
    

    【讨论】:

    • 像魅力一样工作。不过,我还有一个疑问。我有另一个数据框 (df2),其列名与 Hive 表相同,但列的顺序不同。我试图将这些列名作为字符串,以便我可以按该顺序从df2 中选择列。但显然, df("col_name") 只接受一个列名,而不是逗号分隔的列列表
    • 这对你有帮助吗df.select("col_1", "col_2")
    • 我可以使用它,但我认为它接受列,而不是字符串
    • 它接受列的名称,以字符串形式给出
    【解决方案3】:

    基于上述@Srinivas 的回答,这里是等效的 Python 代码。 非常快:

    colNameStr = ",".join(spark.table(hive_table).limit(0).columns)
    

    【讨论】:

      猜你喜欢
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 2020-02-06
      相关资源
      最近更新 更多