Spark столбец данных кадра в запросе выбора Jooq - PullRequest
2 голосов
/ 01 апреля 2020

Я читаю из файла CSV, используя rdd, получаю только один столбец из фрейма данных и преобразую его в массив, используя scala toArray.

После этого я использую этот массив в sql, чтобы проверить, есть ли одно значение поля в этом массиве или нет.

Я использую Postgresql и jooq 3.11, но, насколько я стараюсь, я не могу сделать sql так, как должно быть.

в коде ниже Array[String]. Тем не менее, он не генерирует sql. Я получил эти ошибки, когда экспериментировал с этой проблемой с inline() и DSL.array и in() версиями одного и того же вопроса:

Cannot interpret argument of type class org.jooq.impl.QuantifiedSelectImpl as a Field Type class org.jooq.impl.Array is not supported in dialect DEFAULT operator does not exist: character varying = character varying[] Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.

val ast = select(columns:_*).from(tableName).where(field("y").equal(inline(y))).and(field("x").equal(any(x))).asTable("t")

Как можно Я использую Array[String] для сравнения значений моего столбца в этом массиве.

1 Ответ

0 голосов
/ 02 апреля 2020

Использование генерации исходного кода, чтобы вообще избежать этой проблемы

Обычно рекомендуется использовать генератор кода jOOQ, потому что он выполняет следующую работу за вас, вместо того, чтобы вам приходилось все время думать об этом.

Обойти эту проблему в вашем конкретном случае c case

Во многих случаях jOOQ необходимо знать правильный тип данных выражения Field<T>, чтобы правильно связывать переменные, особенно когда это происходит до PostgreSQL массивов. Вывод типа для этих типов массивов не так силен, как можно было бы надеяться в PostgreSQL. Таким образом, чтобы убедиться, что все работает как положено, вам нужно написать что-то вроде:

field("y", SQLDataType.VARCHAR)
field("x", SQLDataType.VARCHAR)

Если вы не предоставите тип данных, jOOQ просто выведет SQLDataType.OBJECT, что соответствует Types.OTHER в JDB C или java.lang.Object. Поэтому он не знает, как связать массив, и некоторые проблемы вывода типов в Java (и Scala) могут даже привести к неправильной выбранной перегрузке, например, среди перегрузок Field.equal(). В вашем случае, Field.equal(T) был выбран, но вы хотели Field.equal(QuantifiedSelect)

...