Чтение CSV-файла в PySpark, который содержит пару ключ: значение, так что ключ становится столбцом, а значение - его данными. - PullRequest
0 голосов
/ 29 мая 2018

Я новичок в Spark.Пожалуйста, помогите мне с решением.

CSV-файл содержит текст в виде ключ: значение сравнения, разделенные запятой.А в некоторых строках ключи (или столбцы) могут отсутствовать.

Я загрузил этот файл в один столбец кадра данных.Я хочу отделить эти ключи как столбцы и значения, связанные с ним, как данные в этом столбце.И когда пропущены некоторые столбцы, я хочу добавить к этому новый столбец и фиктивные данные.

Фрейм данных

 +----------------------------------------------------------------+
 |   _c0                                                          |
 +----------------------------------------------------------------+
 |name:Pradnya,IP:100.0.0.4, college: SDM, year:2018              |
 |name:Ram, IP:100.10.10.5, college: BVB, semester:IV, year:2018  |
 +----------------------------------------------------------------+

Я хочу вывод в этой форме

  +----------- ----------------------------------------------
  |  name     |  IP         | College   |  Semester | year  |
  +-----------+-------------------------+-----------+-------+
  |  Pradnya  |100.0.0.4    |  SDM      |  null     | 2018  |
  +-----------+-------------+-----------+-----------+-------+
  |  Ram      | 100.10.10.5 | BVB       | IV        |2018   |
  +-----------+-------------+-----------+-----------+-------+

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Если вы знаете, что все имена полей и ключи / значения не содержат встроенных разделителей.тогда вы можете, вероятно, преобразовать строки ключ / значение в объект Row с помощью функции карты RDD.

from pyspark.sql import Row
from string import lower

# assumed you already defined SparkSession named `spark`
sc = spark.sparkContext

# initialize the RDD
rdd = sc.textFile("key-value-file")

# define a list of all field names
columns = ['name', 'IP', 'College', 'Semester', 'year']

# set Row object
def setRow(x):
    # convert line into key/value tuples. strip spaces and lowercase the `k`
    z = dict((lower(k.strip()), v.strip()) for e in x.split(',') for k,v in [ e.split(':') ])
    # make sure all columns shown in the Row object
    return Row(**dict((c, z[c] if c in z else None) for c in map(lower, columns)))

# map lines to Row objects and then convert the result to dataframe
rdd.map(setRow).toDF().show()
#+-------+-----------+-------+--------+----+
#|college|         ip|   name|semester|year|
#+-------+-----------+-------+--------+----+
#|    SDM|  100.0.0.4|Pradnya|    null|2018|
#|    BVB|100.10.10.5|    Ram|      IV|2018|
#+-------+-----------+-------+--------+----+
0 голосов
/ 29 мая 2018

Pyspark не распознает пару ключ: значение.Одним из обходных путей является преобразование файла в формат json, а затем чтение файла json.содержимое файла raw.txt:

name:Pradnya,IP:100.0.0.4, college: SDM, year:2018
name:Ram, IP:100.10.10.5, college: BVB, semester:IV, year:2018

Следующий код создаст файл json:

with open('raw.json', 'w') as outfile:
  json.dump([dict([p.split(':') for p in l.split(',')]) for l in open('raw.txt')], outfile)

Теперь вы можете создать фрейм данных pyspark, используя следующий код:

df = spark.read.format('json').load('raw.json')
...