Замена специального символа «.» на «-» в имени столбца фрейма данных в scala

#scala #dataframe #apache-spark #databricks

#scala #фрейм данных #apache-spark #блоки данных

Вопрос:

Я хочу заменить "BMU 1 Cell 1 Temp. (C)" на "BMU_1_Cell_1_Temp_C" , а также привести столбец к удвоению.

Пробовал следующие варианты:

  1. Предоставлено имя столбца в одинарных кавычках
 val df= df1.withColumn("`BMU 1 Cell 1 Temp. (C)`",col("`BMU 1 Cell 1 Temp. (C)`").cast("Double")).withColumnRenamed("`BMU 1 Cell 1 Temp. (C)`","BMU_1_Cell_1_Temp_C")
  
 val df= df1.withColumn("BMU 1 Cell 1 Temp. (C)",col("BMU 1 Cell 1 Temp. (C)").cast("Double")).withColumnRenamed("BMU 1 Cell 1 Temp. (C)","BMU_1_Cell_1_Temp_C").replaceAll("\.","_"))
  

Получение приведенной ниже ошибки:

 org.apache.spark.sql.AnalysisException: cannot resolve '`BMU 1 PCB Temp. (C)`'
  

Не могли бы вы, пожалуйста, помочь мне с этим.

Ответ №1:

Вот мой spark 3.0.0. test.

 val df = spark.createDataFrame(Seq(("1", "123.456"))).toDF("id", "BMU 1 Cell 1 Temp. (C)")

df.withColumnRenamed("BMU 1 Cell 1 Temp. (C)", "BMU_1_Cell_1_Temp_C")
  .withColumn("BMU_1_Cell_1_Temp_C", $"BMU_1_Cell_1_Temp_C".cast("double")).show

 --- ------------------- 
| id|BMU_1_Cell_1_Temp_C|
 --- ------------------- 
|  1|            123.456|
 --- ------------------- 
  

Либо это работает.

 val df = spark.createDataFrame(Seq(("1", "123.456"))).toDF("id", "BMU 1 Cell 1 Temp. (C)")

val cols = df.columns.map(c => c.replaceAll("([.] )|[ ]", "_").replaceAll("[()]", ""))

df.toDF(cols: _*).withColumn("BMU_1_Cell_1_Temp_C", $"BMU_1_Cell_1_Temp_C".cast("double")).show()

 --- ------------------- 
| id|BMU_1_Cell_1_Temp_C|
 --- ------------------- 
|  1|            123.456|
 --- -------------------