Как добавить поле структуры из определения схемы?

#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. Таким образом, это может быть более эффективным.