Наивный код будет таким же, независимо от количества бит. Если вам не нужна сверхскоростная версия с двойным сверлом, это будет делать
uint32_t x;
uint32_t y;
uint64_t z = 0;
for (int i = 0; i < sizeof(x) * 8; i++)
{
z |= (x & (uint64_t)1 << i) << i | (y & (uint64_t)1 << i) << (i + 1);
}
. Если вам нужно ускорить бит, то это должно работать. Заметим, что x и y должны быть 64-битными переменными.
uint64_t x;
uint64_t y;
uint64_t z = 0;
x = (x | (x << 16)) & 0x0000FFFF0000FFFF;
x = (x | (x << 8)) & 0x00FF00FF00FF00FF;
x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F;
x = (x | (x << 2)) & 0x3333333333333333;
x = (x | (x << 1)) & 0x5555555555555555;
y = (y | (y << 16)) & 0x0000FFFF0000FFFF;
y = (y | (y << 8)) & 0x00FF00FF00FF00FF;
y = (y | (y << 4)) & 0x0F0F0F0F0F0F0F0F;
y = (y | (y << 2)) & 0x3333333333333333;
y = (y | (y << 1)) & 0x5555555555555555;
z = x | (y << 1);
Искра не является повторной. В частности, работники не могут выполнять новые действия или преобразования RDD в течение шага другого действия или преобразования.
Эта проблема возникает, когда selectReviews
вызывается в лямбда-функции карты, которая происходит на рабочем узле, поскольку selectReviews
требует выполнения .select()
для поддержки RDD reviewsDF
.
Обходной путь заключается в замене sc.parallelize
на простой цикл for
или аналогичный, над categories
, выполняемый локально. Ускорение от искры по-прежнему будет задействовано в фильтрации кадров данных, которая возникает при каждом вызове selectReviews
.