У меня есть очень простой CSV-файл с 3 столбцами и 4 строками. >
Код: Выделить всё
State,Current,History
1,2.045301,[2.045236##2.045129##2.044966##2.044824##2.044693]
2,2.042885,[2.042911##2.042961##2.042934##2.042896##2.042937]
3,2.04281,[2.042844##2.042852##2.042832##2.042787##2.042769]
4,2.041843,[2.041854##2.041823##2.041828##2.041824##2.041769]
введите здесь описание изображения
CSV импортируется, и если я запускаю отчет или пытаюсь экспортировать данные, он сразу же работает. Однако мне нужно преобразовать строковые значения в столбце истории в массив, используя «##» в качестве разделителя.
Для этого у меня есть специальный шаг для преобразования этого столбца в множество. Я пробовал множество способов, и каждый раз визуально все выглядит нормально, но если я попытаюсь запустить отчет или экспортировать данные, я получаю сообщение об ошибке без особого объяснения причин.
Код: Выделить всё
from pyspark.sql.functions import col, split, expr
def transform_dataframe(df):
if "History" not in df.columns:
raise ValueError("Column 'History' not found in the DataFrame")
df = df.withColumn(
"History_Array",
expr("transform(split(substring(History, 2, length(History) - 2), '##'), x -> cast(x as double))")
)
return df
try:
df = transform_dataframe(df)
print("Transformation completed successfully")
print("\nNew column info:")
df.select("History_Array").show(5, truncate=False)
df.printSchema()
except Exception as e:
print(f"Error occurred: {str(e)}")
df
Как только я создаю новый столбец, содержащий массив, и удаляю исходный столбец, я выхожу из фрейма данных. Выглядит это так:
Код: Выделить всё
DataFrame Schema:
root
|-- State: long (nullable = true)
|-- Current: double (nullable = true)
|-- History_Array: array (nullable = true)
| |-- element: double (containsNull = true)
Column names:
['State', 'Current', 'History_Array']
Sample rows:
+-----+--------+--------------------------------------------------+
|State|Current |History_Array |
+-----+--------+--------------------------------------------------+
|1 |2.045301|[2.045236, 2.045129, 2.044966, 2.044824, 2.044693]|
|2 |2.042885|[2.042911, 2.042961, 2.042934, 2.042896, 2.042937]|
|3 |2.04281 |[2.042844, 2.042852, 2.042832, 2.042787, 2.042769]|
|4 |2.041843|[2.041854, 2.041823, 2.041828, 2.041824, 2.041769]|
+-----+--------+--------------------------------------------------+
Basic statistics for non-array columns:
+-------+------------------+--------------------+
|summary| State| Current|
+-------+------------------+--------------------+
| count| 4| 4|
| mean| 2.5| 2.04320975|
| stddev|1.2909944487358056|0.001472706663482...|
| min| 1| 2.041843|
| max| 4| 2.045301|
+-------+------------------+--------------------+
Info for column: History_Array
Data type: ArrayType(DoubleType(), True)
Array statistics:
+-------+------------+--------------------+--------------------+
|summary|array_length| min_value| max_value|
+-------+------------+--------------------+--------------------+
| count| 4| 4| 4|
| mean| 5.0| 2.04303175| 2.04322575|
| stddev| 0.0|0.001216792881581...|0.001429753446111...|
| min| 5| 2.041769| 2.041854|
| 25%| 5| 2.041769| 2.041854|
| 50%| 5| 2.042769| 2.042852|
| 75%| 5| 2.042896| 2.042961|
| max| 5| 2.044693| 2.045236|
+-------+------------+--------------------+--------------------+
Number of null arrays: 0
Number of empty arrays: 0
Number of arrays containing NaN elements: 0
Sample data for History_Array:
+--------------------------------------------------+
|History_Array |
+--------------------------------------------------+
|[2.045236, 2.045129, 2.044966, 2.044824, 2.044693]|
|[2.042911, 2.042961, 2.042934, 2.042896, 2.042937]|
|[2.042844, 2.042852, 2.042832, 2.042787, 2.042769]|
|[2.041854, 2.041823, 2.041828, 2.041824, 2.041769]|
+--------------------------------------------------+
Total number of rows: 4
Logging completed successfully
Однако, если я удаляю столбец и затем запускаю отчет, ошибка не возникает.
Я видел, что вы можете иметь столбец массива с плавающей точкой или двойным массивом, поскольку сервис позволяет вам добавить функцию задержки такого типа, и на ее основе выполняются отчеты.
Поскольку это тест данные, которые в конечном итоге будут иметь гораздо большие массивы в каждом столбце, я не могу распределить их по отдельным столбцам.
Как я могу преобразовать свои данные, чтобы иметь столбец, содержащий массив чисел с плавающей запятой или двойных чисел, которые отчет не вылетает?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ights-repo