Являются ли эти значения пустыми или нулевыми и как мне отбросить эти столбцы? - PullRequest
1 голос
/ 03 октября 2019

Итак, у меня есть этот фрейм данных, который выглядит следующим образом:

+----------------+----------+-------------+-----------+---------+-------------+
|_manufacturerRef|_masterRef|_nomenclature|_partNumber|_revision|_serialNumber|
+----------------+----------+-------------+-----------+---------+-------------+
|            #id2|     #id19|             |   zaa01948|         | JTJHA31U2400|
|            #id2|     #id29|             |   zaa22408|         |         null|
|            #id2|     #id45|             |   zaa24981|         |         null|
+----------------+----------+-------------+-----------+---------+-------------+

Я хочу удалить пустые столбцы, которые _nomenclature и _revision, как показано в приведенном выше фрейме данных. Я пробую разные методы, но ни один не упадет. Ни один метод не может обнаружить эти столбцы как пустые. Также может существовать вероятность того, что столбцы также могут иметь тип Struct. Я пытаюсь, как показано ниже:

 val cols = xmldf.columns
    cols.foreach(c => {
      var currDF = xmldf.select("`" + c + "`")
      currDF.show()
      val df1 = currDF.filter(currDF("`" + c + "`").isNotNull)
      if(df1.count() == 0 || df1.rdd.isEmpty()){
        xmldf = xmldf.drop(c)
      }
    })

1 Ответ

2 голосов
/ 03 октября 2019

Проблема с вашим кодом в том, что столбцы _nomeclature и _revision на самом деле не пусты, они содержат пустые строки, а не нули. Из-за этого вы не можете использовать isNotNull, чтобы проверить, пуста ли ячейка, вам нужно использовать оператор =!=.

Вы также можете использовать filter и foldLeft вместо foreach, если вы хотите избежать использования изменяемого var.

val df = List(("#id2","#id19", "", "zaa01947", "", "JTJHA31U2400"), ("#id2", "#id29", "", "zaa22408", "", null)).toDF("_manufacturerRef", "_masterRef", "_nomenclature", "_partNumber", "_revision", "_serialNumber")

val newDf = df.columns
   .filter(c => df.where(df(c) =!= "").isEmpty) //find column containing only empty strings
   .foldLeft(df)(_.drop(_)) //drop all found columns from dataframe

newDf.show()

И, как и ожидалось, _nomeclature и _revision отбрасываются в результате:

+----------------+----------+-----------+-------------+
|_manufacturerRef|_masterRef|_partNumber|_serialNumber|
+----------------+----------+-----------+-------------+
|            #id2|     #id19|   zaa01947| JTJHA31U2400|
|            #id2|     #id29|   zaa22408|         null|
+----------------+----------+-----------+-------------+
...