मुझे अपने डेटाफ्रेम में एक सरणी कॉलम को बदलने की जरूरत है, सरणी को 'शहर' कहा जाता है और इसमें ऐरे (शहर) प्रकार होता है और मैं ऊपरी मामले में शहर का नाम रखना चाहता हूं।

संरचना:

val cities: StructField = StructField("cities", ArrayType(CityType), nullable = true)

def CityType: StructType =
    StructType(
      Seq(
        StructField(code, StringType, nullable = true),
        StructField(name, StringType, nullable = true)
      )
)

कोड मैंने कोशिश की:

   .withColumn(
      newColumn,
      forall(
        col(cities),
        (col: Column) =>
          struct(
            Array(
              col(code),
              upper(col(name))
            ): _*
          )
      )
    )

त्रुटि कहते हैं

हल नहीं कर सकता 'forall(...

1
MrElephant 2 जून 2021, 18:13

1 उत्तर

सबसे बढ़िया उत्तर

forall नाम की कोई चीज नहीं है। आप इसके बजाय transform का उपयोग कर सकते हैं:

// sample data
val df = spark.sql("select array(struct('1' as code, 'abc' as name), struct('2' as code, 'def' as name)) cities")

import org.apache.spark.sql.Column

val df2 = df.withColumn(
    "newcol", 
    transform(
        col("cities"), 
        (c: Column) => struct(c("code"), upper(c("name")))
    )
)

df2.show
+--------------------+--------------------+
|              cities|              newcol|
+--------------------+--------------------+
|[[1, abc], [2, def]]|[[1, ABC], [2, DEF]]|
+--------------------+--------------------+
2
mck 2 जून 2021, 18:20