#scala #apache-spark
#scala #apache-spark
Вопрос:
Есть ли хороший способ в scala достичь следующего? Мой текущий код выглядит следующим образом,
val secConfig: ArrayType = ArrayType(
StructType(
StructField("rand55", StringType, nullable = true),
StructField("rand2", DoubleType, nullable = true),
StructField("rand22", LongType, nullable = true),
StructField("rand31", DoubleType, nullable = true),
.....
StructField("rand24", DoubleType, nullable = true),
)
)
val fieldSchema: StructField = StructField("field_name", secConfig, nullable = true)
val newDf = df.withColumn("new_col",
array(
struct(
lit(null).cast(StringType).as("rand55"),
lit(null).cast(DoubleType).as("rand2"),
lit(null).cast(Longype).as("rand22"),
lit(null).cast(DoubleType).as("rand314"),
...
lit(null).cast(DoubleType).as("rand24"),
)))
Я просто хочу добавить nulls, typecast и назвать поля из схемы. Есть ли в scala хороший способ избежать избыточности жесткого кодирования для нескольких столбцов?
Ответ №1:
Вы можете вставить цикл для выполнения задания
import org.apache.spark.sql.types.{StructField, StructType, StringType, DoubleType}
// Creating a bogus dataframe in order to follow your example
val df = Seq((1,2),(11,22)).toDF("One", "Two")
val newDf = df.withColumn("new_col",
array(
struct( (0 to 24).map(i => {
lit(null).cast(StringType).as(s"f$i")
}):_*
)))
newDf.printSchema
Которое возвращает:
root
|-- One: integer (nullable = false)
|-- Two: integer (nullable = false)
|-- new_col: array (nullable = false)
| |-- element: struct (containsNull = false)
| | |-- f20: string (nullable = true)
| | |-- f21: string (nullable = true)
| | |-- f22: string (nullable = true)
| | |-- f23: string (nullable = true)
| | |-- f24: string (nullable = true)
Комментарии:
1. Спасибо Ларсу за ответ. Но, пожалуйста, обратите внимание, что имена столбцов — это просто представление, а реальные имена столбцов случайны. Теперь я обновил вопрос.
2. Но суть я все равно понял. Голосую за ваш ответ
3. Вместо того, чтобы выполнять итерацию в dataframe для withColumn, то же самое можно сделать при создании объекта secConfig, а затем применить его к dataframe, который автоматически добавит значения null. Таким образом, это может быть более эффективным.