जब शर्त केवल डेटाफ़्रेम में मौजूद है, तब लागू करना

Aug 17 2020

मैं java8 के साथ स्पार्क- sql-2.4.1v का उपयोग कर रहा हूं। मेरे पास एक परिदृश्य है जहां मुझे कुछ ऑपरेशन करने की आवश्यकता है यदि कॉलम दिए गए डेटाफ्रेम कॉलम सूची में प्रस्तुत करता है

मेरे पास नीचे के रूप में नमूना डेटा फ़्रेम है, डेटाफ़्रेम के कॉलम डेटाबेस तालिका पर निष्पादित बाहरी क्वेरी के आधार पर भिन्न होंगे।

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")

जैसा कि डेटाफ्रेम "डेटा" कॉलम के ऊपर दिखाया गया है, निश्चित नहीं है और भिन्न होगा और इसमें "column1", "column2", "column3" ... "columnN" होगा ...

तो कॉलम उपलब्धता पर निर्भर करें, मुझे "जब-खंड" का उपयोग करने की कोशिश कर रहा है, जब एक कॉलम मौजूद है, तो मुझे निर्दिष्ट कॉलम पर कुछ ऑपरेशन करना होगा और अगले ऑपरेशन के लिए आगे बढ़ना होगा।

मैं "जब-क्लूज़" का उपयोग करके दो तरीकों से नीचे कोशिश कर रहा हूं

पहला तरीका:

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

दूसरा तरीका:

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

त्रुटि:

सरणी प्रकार [] पर चालान (कॉलम) शामिल नहीं कर सकते

तो java8 कोड का उपयोग करके इस परिदृश्य को कैसे संभालें?

जवाब

1 Som Aug 17 2020 at 19:26

आप एक कॉलम बना सकते हैं जिसमें सभी कॉलम नाम हों। फिर आप यह देख सकते हैं कि कॉलम मौजूद है या नहीं और अगर उपलब्ध है तो प्रक्रिया करें-

 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)