【问题标题】:Spark 1.6: drop column in DataFrame with escaped column namesSpark 1.6:在 DataFrame 中使用转义的列名删除列
【发布时间】: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)

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

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

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

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

    【讨论】:

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

    对于普通列可以正常工作

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

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 2015-12-20
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2016-06-06
      • 2018-05-25
      相关资源
      最近更新 更多