Как преобразовать строковый элемент в числовой в RDD - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу преобразовать строковые элементы в следующем СДР

    data0 = sc.parallelize( [('0', '2.023'), ('0.2', '4.235'), ('1.23', '0.45'), ('1.23', '10.2'), ('1.0', '20.0')] )

в числовые значения. Таким образом, ожидаемый результат равен

[(0, 2.023), (0.2, 4.235), (1.23, 0.45), (1.23, 10.2), (1.0, 20.0)]

Я пытался

data0.map(lambda x: x.split(',')).map(lambda x: (float(x[0]),float(x[1])))

и

data0.map(lambda line: line.split(",")).map(lambda numbers: Vectors.dense(numbers.map(_.toInt)))

в Преобразование строки RDD в Int RDD . Однако ни один из них не работал.

Я знаю, что, возможно, есть несколько подходов, которые сначала конвертируют RDD в dataframe, а затем делают это. Что если я захочу завершить свою задачу в СДР, не меняя ее на фрейм данных (потому что, может быть, очень дорого), как мне это сделать? Это всего лишь пример. В более общем случае предположим, что в одной строке много элементов, что не позволяет сформулировать их один за другим. Тогда как мы можем это сделать?

Спасибо.

1 Ответ

1 голос
/ 01 ноября 2019

Вы пытаетесь разделить кортеж запятой. Строки могут быть разделены запятой. "0.01, 0.02".split(",") вернет ["0.01", "0.02"]. Но у вас уже есть кортеж ("0.01", "0.02"), и вам просто нужно преобразовать оба элемента в плавающее. Вы пишете правильный код, просто делаете дополнительный ненужный первый шаг, из-за которого код не выполняется.

У меня работает:

data0 = sc.parallelize([('0', '2.023'), ('0.2', '4.235'), ('1.23', '0.45'), ('1.23', '10.2'), ('1.0', '20.0')])
data0.take(5)
# [('0', '2.023'), ('0.2', '4.235'), ('1.23', '0.45'), ('1.23', '10.2'), ('1.0', '20.0')]
# Convert to float
data0.map(lambda x: (float(x[0]), float(x[1]))).take(5)
# [(0.0, 2.023), (0.2, 4.235), (1.23, 0.45), (1.23, 10.2), (1.0, 20.0)]

РЕДАКТИРОВАТЬ:

Если вы хотите обобщить все элементы элемента tuple:

data0.map(lambda x: tuple([float(i) for i in x]))
...