Я смог отправить его, преобразовав их в строку. ES интерпретирует типы данных с умом.
df.rdd.map(row => {
var m = Map[String, Any]()
(0 until len).foreach(i => {
m += (schema.fields(i).name -> row.getAs[String](i))
})
m
}).saveToEs("path")
Это поведение намекает на недостающую оптимизацию последнего вызова, так, чтобы Ваша рекурсия унесла стек. Возможная причина - то, что Вы декламировали отладку оптимизации.
Между прочим, Вы не должны выполнять явный вызов к return-from
. С тех пор sum
символ самооценки, можно изменить эту строку
(return-from count-reduced-fractions sum)
кому:
sum
править: Объяснение предложенного изменения: "сумма" оценивает к ее собственному значению, которое становится возвращаемым значением, "если" оператор, который (так как это - последний оператор в defun) становится возвращаемым значением функции.
править: Объяснение декламируемой оптимизации: Вы могли добавить следующее к своему верхнему уровню:
(declaim (optimize (speed 3)
(debug 0)))
или используйте то же, но с declare
вместо declaim
как первый оператор в Вашей функции. Вы могли также попробовать (расположите с интервалами 3), и (безопасность 0), если она не работает.
Оптимизация последнего вызова означает, что вызов функции, возвращаемое значение которого непосредственно возвращается, переводится в замену кадра на стеке (вместо того, чтобы сложить), эффективно "сглаживание" рекурсивной функции звонит в цикл, и устраняя вызовы рекурсивной функции. Это делает отладку немного тяжелее, потому что нет никаких вызовов функции, где Вы ожидаете их, resp. Вы не знают, как "глубоко" в рекурсию ошибка происходит (так же, как если бы Вы записали цикл для начала). Ваша среда могла бы сделать некоторые выступления по умолчанию, которые необходимо переопределить для включения TCO.
править: Просто пересмотрев этот вопрос, что g
? Я думаю, что Вы на самом деле хотите
(let ((g (gcd n d)))
;; ...
)
Как стиль, Вы могли сделать d и сумму дополнительными.
(defun test (n &optional (d n) (sum 0)) .. )
Мое предположение - то, что существует встроенный предел глубины стека с lispbox. Так как язык Common LISP не гарантирует, что рекурсивные функции хвоста используют постоянное стековое пространство, возможно, что каждый вызов count-reduced-fractions добавляет другой слой на стеке.
Между прочим, SBCL выполняет этот алгоритм без проблемы.
* (count-reduced-fractions 53 53 0)
881
* (count-reduced-fractions 100 100 0)
3043