Фильтровать набор данных, используя, где столбец не является числом, используя Spark Java API 2.2? - PullRequest
0 голосов
/ 30 мая 2018

Я новичок в Spark Java API.Я хочу отфильтровать мой набор данных, где столбец не является числом.Мой набор данных ds1 выглядит примерно так:

+---------+------------+
|  account|    amount  |
+---------+------------+
| aaaaaa  |            |
| aaaaaa  |            |
| bbbbbb  |            |
| 123333  |            |
| 555555  |            |
| 666666  |            |

Я хочу вернуть набор данных ds2 следующим образом:

+---------+------------+
|  account|    amount  |
+---------+------------+
| 123333  |            |
| 555555  |            |
| 666666  |            |

Я пробовал это, но id не работает для меня.

 ds2=ds1.select("account"). where(dsFec.col("account").isNaN());

Может кто-нибудь подсказать мне примерное искровое выражение, чтобы решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Просто приведите и убедитесь, что результат равен нулю:

ds1.select("account").where(dsFec.col("account").cast("bigint").isNotNull());
0 голосов
/ 31 мая 2018

Вы можете определить функцию udf для проверки, является ли строка в столбце account числовой или нет как

    UDF1 checkNumeric = new UDF1<String, Boolean>() {
        public Boolean call(final String account) throws Exception {
            return StringUtils.isNumeric(account);
        }
    };

    sqlContext.udf().register("numeric", checkNumeric, DataTypes.BooleanType);

, а затем использовать функцию callUDF для вызова функции udf как

    df.filter(callUDF("numeric", col("account"))).show();

, что должно дать вам

+-------+------+
|account|amount|
+-------+------+
| 123333|      |
| 555555|      |
| 666666|      |
+-------+------+
0 голосов
/ 30 мая 2018

Один из способов сделать это:

Эквивалент Scala:

import scala.util.Try
df.filter(r => Try(r.getString(0).toInt).isSuccess).show()

+-------+------+
|account|amount|
+-------+------+
| 123333|      |
| 555555|      |
| 666666|      |
+-------+------+

Или Вы можете использовать то же самое, используя команду try catch:

df.map(r => (r.getString(0),r.getString(1),{try{r.getString(0).toInt; true
                }catch {
                      case runtime: RuntimeException => {
                        false}
                      }
            })).filter(_._3 == true).drop("_3").show()

+------+---+
|    _1| _2|
+------+---+
|123333|   |
|555555|   |
|666666|   |
+------+---+
...