2016-04-06 2 views
0

Я конвертирую простой R-код в SparkR для эффективного использования Spark.Как найти длину столбца в SparkR

У меня есть нижняя колонка CloseDate.

CloseDate 
2011-01-08 
2011-02-07 
2012-04-07 
2013-04-18 
2011-02-07 
2010-11-10 
2010-12-09 
2013-02-18 
2010-12-09 
2011-03-11 
2011-04-10 
2013-06-19 
2011-04-10 
2011-01-06 
2011-02-06 
2013-04-16 
2011-02-06 
2015-09-25 
2015-09-25 
2010-11-10 

Я хочу посчитать количество раз, когда эта дата была увеличена | уменьшена. Для этого у меня есть код R ниже.

dateChange <- function(closeDate, dir){ 
    close_dt <- as.Date(closeDate) 
    num_closedt_out = 0 
    num_closedt_in = 0 

    for(j in 1:length(close_dt)) 
    { 
    curr <- close_dt[j] 
    if (j > 1) 
     prev <- close_dt[j-1] 
    else 
     prev <- curr 
    if (curr > prev){ 
     num_closedt_out = num_closedt_out + 1 
    } 
    else if (curr < prev){ 
     num_closedt_in = num_closedt_in + 1 
    } 
    } 
    if (dir=="inc") 
    ret <- num_closedt_out 
    else if (dir=="dec") 
    ret <- num_closedt_in 
    ret 
} 

Я попытался использовать SparkR df $ col здесь. Поскольку искра лениво выполняет код, я не получил значение длины во время этого выполнения и получал ошибку NaN.

Вот модифицированный код, который я пробовал.

DateDirChanges <- function(closeDate, dir){ 
    close_dt <- to_date(closeDate) 
    num_closedt_out = 0 
    num_closedt_in = 0 

    col_len <- SparkR::count(close_dt) 
    for(j in 1:col_len) 
    { 
    curr <- close_dt[j] 
    if (j > 1) 
     prev <- close_dt[j-1] 
    else 
     prev <- curr 
    if (curr > prev){ 
     num_closedt_out = num_closedt_out + 1 
    } 
    else if (curr < prev){ 
     num_closedt_in = num_closedt_in + 1 
    } 
    } 
    if (dir=="inc") 
    ret <- num_closedt_out 
    else if (dir=="dec") 
    ret <- num_closedt_in 
    ret 
} 

Как я могу получить длину столбца во время выполнения этого кода? Или есть еще лучше?

ответ

2

Вы не можете, потому что Column просто не имеет длины. В отличие от того, что вы можете ожидать, в столбцах R не представлены данные, а выражения SQL и конкретные преобразования данных. Более того, порядок значений в Spark DataFrame является произвольным, поэтому вы не можете просто осмотреться.

Если данные могут быть разделены так же, как в вашем предыдущем вопросе, вы можете использовать функции окна в том же состоянии, что и я, как показано на рисунке in the answer to your previous question. В противном случае нет эффективного способа справиться с этим, используя SparkR.

Предполагая, что есть способ, чтобы определить порядок (обязательно), и вы можете разделить ваши данные (желательно, чтобы получить достаточную производительность) все, что вам нужно что-то вроде этого:

SELECT 
    CAST(LAG(CloseDate, 1) OVER w > CloseDate AS INT) gt, 
    CAST(LAG(CloseDate, 1) OVER w < CloseDate AS INT) lt, 
    CAST(LAG(CloseDate, 1) OVER w = CloseDate AS INT) eq 
FROM DF 
WINDOW w AS (
    PARTITION BY partition_col ORDER BY order_col 
) 
+0

Я думаю, что могу разделить данные, как Что ж. Но мы используем lateiff для получения желаемого результата. Но здесь мне нужно написать пользовательскую функцию. Например, он должен проверить, увеличивается или уменьшается значение из его LAG, и оно должно просто вернуть количество раз, когда значение увеличилось или уменьшилось. Таким образом, эта пользовательская функция должна читать данные для создания нового столбца. Есть ли возможность сделать это? – sag

+0

До тех пор, пока у вас есть способ определить порядок (требуется) и разбиение на разделы (для производительности), это довольно просто. – zero323

+0

Это точно похоже на предыдущий вопрос. Я просто упорствовал в tempTable и получил отставание. Там мы используем датифф, чтобы получить разницу. Здесь нам нужно написать что-то вроде getIncrementCount (df $ closeDate, df $ lagCloseDate). В этой функции мне нужно перебирать и поддерживать счет. Этот счет должен быть увеличен на единицу каждый раз, когда closeDate больше, чем lagCloseDate. Я действительно ссылался на некоторые функции по умолчанию, предоставляемые SparkR, но все они называют java для этого. Возможно ли это R? Извините, если вопрос слишком тупой. Я очень новичок в R и SparkR – sag