#scala #dataframe #apache-spark #databricks
#scala #фрейм данных #apache-spark #блоки данных
Вопрос:
Я хочу заменить "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")
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|
--- -------------------