Как добавить разделители в CSV-файл - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть CSV-файл без разделителей. Можно ли добавить разделители в определенной позиции в PySpark? как,

мой файл выглядит так:

USDINRFUTCUR23Feb201700000000FF00000000000001990067895000000000NNN*12
USDINRFUTCUR24Feb201700000000FF00000000000001990067895000000000NNN*12
USDINRFUTCUR25Feb201700000000FF00000000000001990067895000000000NNN*12

и я хочу разделители на 3-й, 6-й 12-й позиции

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

Для файлов фиксированной ширины есть pandas .read_fwf ()

widths = [
    3, 
    6, 
    12, 
 ]
df = pd.read_fwf("fixed_width.txt", widths=widths)
df
1 голос
/ 27 февраля 2020

Для использования решения распределенного pyspark не существует аналогичного способа добавить разделитель прямо во время чтения (как pandas). Масштабируемым способом решения этой проблемы будет чтение данных как есть в одном столбце, а затем использование приведенного ниже кода (с использованием функций pyspark) для создания ваших столбцов.

Создание примера кадра данных:

from pyspark.sql import functions as F
from pyspark.sql.types import *

list=[['USDINRFUTCUR23Feb201700000000FF00000000000001990067895000000000NNN*12'],
      ['USDINRFUTCUR24Feb201700000000FF00000000000001990067895000000000NNN*12'],
      ['USDINRFUTCUR25Feb201700000000FF00000000000001990067895000000000NNN*12']]

df=spark.createDataFrame(list,['col1'])

df.show(truncate=False)


+---------------------------------------------------------------------+
|col1                                                                 |
+---------------------------------------------------------------------+
|USDINRFUTCUR23Feb201700000000FF00000000000001990067895000000000NNN*12|
|USDINRFUTCUR24Feb201700000000FF00000000000001990067895000000000NNN*12|
|USDINRFUTCUR25Feb201700000000FF00000000000001990067895000000000NNN*12|
+---------------------------------------------------------------------+

Используйте substr и withcolumn , чтобы создать новые столбцы, и отбросьте первый. Вы можете создать def (функцию), которая также читает и выполняет этот код, чтобы вы могли повторно использовать и упростить ваш конвейер

df.withColumn("Currency1", F.col("col1").substr(0,3))\
  .withColumn("Currency2", F.col("col1").substr(4,3))\
  .withColumn("Type", F.col("col1").substr(7,6))\
  .withColumn("Time", F.expr("""substr(col1,13,length(col1))"""))\
  .drop("col1").show(truncate=False)
  #output



+---------+---------+------+---------------------------------------------------------+
|Currency1|Currency2|Type  |Time                                                     |
+---------+---------+------+---------------------------------------------------------+
|USD      |INR      |FUTCUR|23Feb201700000000FF00000000000001990067895000000000NNN*12|
|USD      |INR      |FUTCUR|24Feb201700000000FF00000000000001990067895000000000NNN*12|
|USD      |INR      |FUTCUR|25Feb201700000000FF00000000000001990067895000000000NNN*12|
+---------+---------+------+---------------------------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...