Spark 1.6:在 DataFrame 中使用转义的列名删除列

Posted

技术标签:

【中文标题】Spark 1.6:在 DataFrame 中使用转义的列名删除列【英文标题】:Spark 1.6: drop column in DataFrame with escaped column names 【发布时间】:2016-03-14 22:34:53 【问题描述】:

试图在 DataFrame 中删除一列,但我的列名中带有点,我转义了。

在我逃跑之前,我的架构如下所示:

root
 |-- user_id: long (nullable = true)
 |-- hourOfWeek: string (nullable = true)
 |-- observed: string (nullable = true)
 |-- raw.hourOfDay: long (nullable = true)
 |-- raw.minOfDay: long (nullable = true)
 |-- raw.dayOfWeek: long (nullable = true)
 |-- raw.sensor2: long (nullable = true)

如果我尝试删除一列,我会得到:

df = df.drop("hourOfWeek")
org.apache.spark.sql.AnalysisException: cannot resolve 'raw.hourOfDay' given input columns raw.dayOfWeek, raw.sensor2, observed, raw.hourOfDay, hourOfWeek, raw.minOfDay, user_id;
        at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
        at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:60)
        at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:57)
        at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:319)
        at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:319)
        at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:53)

请注意,我什至没有尝试删除名称中带有点的列。 由于如果不转义列名,我似乎无法做很多事情,因此我将架构转换为:

root
 |-- user_id: long (nullable = true)
 |-- hourOfWeek: string (nullable = true)
 |-- observed: string (nullable = true)
 |-- `raw.hourOfDay`: long (nullable = true)
 |-- `raw.minOfDay`: long (nullable = true)
 |-- `raw.dayOfWeek`: long (nullable = true)
 |-- `raw.sensor2`: long (nullable = true)

但这似乎没有帮助。我仍然遇到同样的错误。

我尝试转义所有列名,并使用转义后的名称删除,但这也不起作用。

root
 |-- `user_id`: long (nullable = true)
 |-- `hourOfWeek`: string (nullable = true)
 |-- `observed`: string (nullable = true)
 |-- `raw.hourOfDay`: long (nullable = true)
 |-- `raw.minOfDay`: long (nullable = true)
 |-- `raw.dayOfWeek`: long (nullable = true)
 |-- `raw.sensor2`: long (nullable = true)

df.drop("`hourOfWeek`")
org.apache.spark.sql.AnalysisException: cannot resolve 'user_id' given input columns `user_id`, `raw.dayOfWeek`, `observed`, `raw.minOfDay`, `raw.hourOfDay`, `raw.sensor2`, `hourOfWeek`;
        at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)
        at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1$$anonfun$apply$2.applyOrElse(CheckAnalysis.scala:60)

还有其他方法可以删除不会在此类数据上失败的列吗?

【问题讨论】:

【参考方案1】:

好吧,我好像终于找到了解决办法:

df.drop(df.col("raw.hourOfWeek")) 似乎有效

【讨论】:

有用的答案。但我还有一个类似的问题。假设我在 Spark Dataframe 中有大约 100 列。有没有办法从这个数据框中只选择几列并用这些选定的列创建另一个数据框?像 df2 = df1.select(df.col("col1", "col2")) 我认为***.com/questions/36131716/… 回答了你的问题【参考方案2】:
val data = df.drop("Customers");

对于普通列可以正常工作

val new = df.drop(df.col("old.column"));

【讨论】:

以上是关于Spark 1.6:在 DataFrame 中使用转义的列名删除列的主要内容,如果未能解决你的问题,请参考以下文章

基于不同类型spark 1.6列的Spark join dataframe

带有浮点数 Spark 1.6 的 DataFrame 上的 SQL 百分位数 - 任何可能的解决方法? [复制]

如何在 PySpark 1.6 中将 DataFrame 列从字符串转换为浮点/双精度?

大数据盘点之Spark篇

大数据盘点之Spark篇

如何在 Spark 中使用 Python 查找 DataFrame 中的分区数以及如何在 Spark 中使用 Python 在 DataFrame 中创建分区