gpt4 book ai didi

scala - Spark 1.6 将函数应用于名称中带有点的列/如何正确转义 colName

转载 作者:行者123 更新时间:2023-12-04 19:46:22 24 4
gpt4 key购买 nike

要将函数应用于 Spark 中的列,常用的方法(唯一的方法?)似乎是
df.withColumn(colName, myUdf(df.col(colName))
很好,但我的名称中有带点的列,要访问该列,我需要使用反引号“`”转义名称

问题是:如果我使用该转义名称,则 .withColumn 函数会使用转义名称创建一个新列

df.printSchema
root
|-- raw.hourOfDay: long (nullable = false)
|-- raw.minOfDay: long (nullable = false)
|-- raw.dayOfWeek: long (nullable = false)
|-- raw.sensor2: long (nullable = false)

df = df.withColumn("raw.hourOfDay", df.col("raw.hourOfDay"))
org.apache.spark.sql.AnalysisException: Cannot resolve column name "raw.hourOfDay" among (raw.hourOfDay, raw.minOfDay, raw.dayOfWeek, raw.sensor2);

这有效:
df = df.withColumn("`raw.hourOfDay`", df.col("`raw.hourOfDay`"))
df: org.apache.spark.sql.DataFrame = [raw.hourOfDay: bigint, raw.minOfDay: bigint, raw.dayOfWeek: bigint, raw.sensor2: bigint, `raw.hourOfDay`: bigint]

scala> df.printSchema
root
|-- raw.hourOfDay: long (nullable = false)
|-- raw.minOfDay: long (nullable = false)
|-- raw.dayOfWeek: long (nullable = false)
|-- raw.sensor2: long (nullable = false)
|-- `raw.hourOfDay`: long (nullable = false)

但正如您所看到的,架构有一个新的转义列名。

如果我执行上述操作并尝试删除带有转义名称的旧列,它将删除旧列,但之后任何尝试访问新列的结果如下:
org.apache.spark.sql.AnalysisException: Cannot resolve column name "`raw.sensor2`" among (`raw.hourOfDay`, `raw.minOfDay`, `raw.dayOfWeek`, `raw.sensor2`);

好像它现在将反引号理解为名称的标准,而不是转义字符。

那么我如何用 withColumn“替换”我的旧专栏不改名?

(PS:请注意,我的列名是参数化的,所以我在名称上使用了一个循环。为了清楚起见,我在这里使用了特定的字符串名称:转义序列实际上看起来像 "`"+colName+"`")

编辑:

现在我发现的唯一技巧是:
for (t <- df.columns) {
if (t.contains(".")) {
df = df.withColumn("`" + t + "`", myUdf(df.col("`" + t + "`")))
df = df.drop(df.col("`" + t + "`"))
df = df.withColumnRenamed("`" + t + "`", t)
}
else {
df = df.withColumn(t, myUdf(df.col(t)))
}
}

我猜不是很有效...

编辑 :

文档状态:
def withColumn(colName: String, col: Column): DataFrame
Returns a new DataFrame by adding a column
or replacing the existing column that has the same name.

所以更换一列应该不是问题。
但是,正如下面@Glennie 所指出的,使用新名称可以正常工作,因此这可能是 Spark 1.6 中的错误

最佳答案

谢谢你的窍门。

df = df.withColumn("`" + t + "`", myUdf(df.col("`" + t + "`")))
df = df.drop(df.col("`" + t + "`"))
df = df.withColumnRenamed("`" + t + "`", t)

它对我来说很好。期待看到更好的解决方案。只是提醒一下,我们也会遇到与“#”字符类似的问题。

关于scala - Spark 1.6 将函数应用于名称中带有点的列/如何正确转义 colName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com