Yalnızca veri çerçevesinde sütun mevcut olduğunda koşul uygulanıyor

Aug 17 2020

Java8 ile spark-sql-2.4.1v kullanıyorum. Verilen veri çerçevesi sütun listesinde sütunlar varsa, belirli bir işlemi gerçekleştirmem gereken bir senaryom var

Aşağıdaki gibi Örnek veri çerçevem ​​var, veri çerçevesinin sütunları, veritabanı tablosunda yürütülen harici sorguya göre farklılık gösterecektir.

val data = List(
  ("20", "score", "school", "2018-03-31", 14 , 12 , 20),
  ("21", "score", "school", "2018-03-31", 13 , 13 , 21),
  ("22", "rate", "school", "2018-03-31", 11 , 14, 22),
  ("21", "rate", "school", "2018-03-31", 13 , 12, 23)
 )

val df = data.toDF("id", "code", "entity", "date", "column1", "column2" ,"column3"..."columnN")

yukarıda gösterildiği gibi veri çerçevesi "veri" sütunları sabit değildir ve değişiklik gösterir ve "sütun1", "sütun2", "sütun3" ... "sütunN" ...

Bu nedenle, sütun kullanılabilirliğine bağlı olarak, aynı işlem için bazı işlemleri gerçekleştirmem gerekiyor, "when-clause" kullanmaya çalışıyorum, bir sütun mevcut olduğunda, belirtilen sütunda belirli bir işlemi gerçekleştirmem gerekiyor, aksi takdirde bir sonraki işleme geçiyorum ..

"When-cluase" kullanarak aşağıdaki iki yolu deniyorum

Birinci yol:

 Dataset<Row> resultDs =  df.withColumn("column1_avg", 
                     when( df.schema().fieldNames().contains(col("column1")) , avg(col("column1"))))
                     )
 

İkinci yol:

  Dataset<Row> resultDs =  df.withColumn("column2_sum", 
                     when( df.columns().contains(col("column2")) , sum(col("column1"))))
                     )

Hata:

String [] dizi türünde contains (Sütun) çağrılamaz

peki java8 kodunu kullanarak bu senaryoyu nasıl ele alacaksınız?

Yanıtlar

1 Som Aug 17 2020 at 19:26

Tüm sütun adlarına sahip bir sütun oluşturabilirsiniz. o zaman sütunun mevcut olup olmadığını kontrol edebilir ve mevcut olup olmadığını işleyebilirsiniz.

 df.withColumn("columns_available", array(df.columns.map(lit): _*))
      .withColumn("column1_org",
      when( array_contains(col("columns_available"),"column1") , col("column1")))
      .withColumn("x",
        when( array_contains(col("columns_available"),"column4") , col("column1")))
      .withColumn("column2_new",
        when( array_contains(col("columns_available"),"column2") , sqrt("column2")))
      .show(false)