Как передать List [String] для выбора или selectExpr в искре, когда строка также содержит UDF

Мне нравятся оба решения. Вот еще один способ, который приходит мне на ум (возможно, не лучше).

((~((unsigned int)0) << k) >> (k + n)) << n

ИЗМЕНИТЬ: В моей предыдущей версии произошла ошибка (это было без неподписанного int cast ). Проблема заключалась в том, что ~0 >> n добавляет 1s спереди, а не 0s.

И да, этот подход имеет один большой недостаток; он предполагает, что вы знаете количество бит целочисленного типа по умолчанию или, другими словами, оно предполагает, что вы действительно знаете k, тогда как другие решения не зависят от k. Это делает мою версию менее переносной или, по крайней мере, труднее переносить. (Он также использует 3 смены и добавление и оператор побитового отрицания, что является двумя дополнительными операциями.)

Таким образом, вам лучше использовать один из других примеров.

Здесь это небольшое тестовое приложение, сделанное Джонатаном Леффлером, для сравнения и проверки вывода различных решений:

#include <stdio.h>
#include <limits.h>

enum { ULONG_BITS = (sizeof(unsigned long) * CHAR_BIT) };

static unsigned long set_mask_1(int k, int m, int n)
{
    return ~(~0 << m) << n;
}

static unsigned long set_mask_2(int k, int m, int n)
{
    return ((1 << m) - 1) << n;
}

static unsigned long set_mask_3(int k, int m, int n)
{
    return ((~((unsigned long)0) << k) >> (k + n)) << n;
}

static int test_cases[][2] =
{
    { 1, 0 },
    { 1, 1 },
    { 1, 2 },
    { 1, 3 },
    { 2, 1 },
    { 2, 2 },
    { 2, 3 },
    { 3, 4 },
    { 3, 5 },
};

int main(void)
{
    size_t i;
    for (i = 0; i < 9; i++)
    {
        int m = test_cases[i][0];
        int n = test_cases[i][1];
        int k = ULONG_BITS - (m + n);
        printf("%d/%d/%d = 0x%08lX = 0x%08lX = 0x%08lX\n", k, m, n,
               set_mask_1(k, m, n),
               set_mask_2(k, m, n),
               set_mask_3(k, m, n));
    }
    return 0;
}
0
задан Goutam Pradhan 19 March 2019 в 16:38
поделиться

1 ответ

Я нашел причину, по которой он не работал,

вы можете передать List [String], как показано ниже:

val detailsList = List(verifyLength(col1, 0, 0, 'RJ', 9) as col1, verifyLength(col2, 0, 0, 'RJ', 9) as col2)
spark.udf.register("verifyLength", verifyLengthCheck _)
 val df1= df.selectExpr(detailsList:_*)

Пожалуйста, следуйте по ссылке ниже: введите ссылку описание здесь

0
ответ дан Goutam Pradhan 19 March 2019 в 16:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: