Сдвинуть значение столбца pyspark на единицу влево - PullRequest
1 голос
/ 06 августа 2020

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

|name|age|height      |weight             
+-------------+--------------------+------------------------+------------------------+-------------------------+--------------------+------------------+------------------+------------+
|  |Mike       |20|6-7|

Как видите, значения и имена столбцов не выровнены. Например, «Майк» должен быть в столбце «имя», а не возраст.

Как мне сдвинуть значения влево на единицу, чтобы они соответствовали имени столбца? Идеальный фрейм данных выглядит так:

   |name|age|height  |weight             
    +-------------+--------------------+------------------------+------------------------+-------------------------+--------------------+------------------+------------------+------------+
    | Mike  |20  |6-0|160|

Обратите внимание, что приведенные выше данные являются лишь примером. На самом деле у меня более 200 столбцов и более 1 миллиона строк данных.

1 Ответ

1 голос
/ 06 августа 2020

Попробуйте использовать .toDF с новыми именами столбцов, удалив столбец из фрейма данных.

Example:

df=spark.createDataFrame([('','Mike',20,'6-7',160)],['name','age','height','weight'])
df.show()
#+----+----+------+------+---+
#|name| age|height|weight| _5|
#+----+----+------+------+---+
#|    |Mike|    20|   6-7|160|
#+----+----+------+------+---+

#select all columns except name
df1=df.select(*[i for i in df.columns if i != 'name'])

drop_col=df.columns.pop()
req_cols=[i for i in df.columns if i != drop_col]

df1.toDF(*req_cols).show()
#+----+---+------+------+
#|name|age|height|weight|
#+----+---+------+------+
#|Mike| 20|   6-7|   160|
#+----+---+------+------+

Using spark.createDataFrame():

cols=['name','age','height','weight']

spark.createDataFrame(df.select(*[i for i in df.columns if i != 'name']).rdd,cols).show()
#+----+---+------+------+
#|name|age|height|weight|
#+----+---+------+------+
#|Mike| 20|   6-7|   160|
#+----+---+------+------+

Если вы создаете фрейм данных , а reading a file, тогда определите схема , имеющая имя первого столбца как dummy, затем, как только вы прочитаете данные, удалите столбец с помощью функции .drop().

spark.read.schema(<struct_type schema>).csv(<path>).drop('<dummy_column_name>')

spark.read.option("header","true").csv(<path>).toDF(<columns_list_with dummy_column>).drop('<dummy_column_name>')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...