将数据框中的列值转换为列表

时间:2018-09-04 07:03:39

标签: python apache-spark pyspark

我有以下源文件。我的文件中有一个名为“ john”的名称,希望拆分成列表['j','o','h','n']。请按如下方式找到人员档案。

源文件:

id,name,class,start_data,end_date
1,john,xii,20170909,20210909

代码:

from pyspark.sql import SparkSession

def main():
    spark = SparkSession.builder.appName("PersonProcessing").getOrCreate()

    df = spark.read.csv('person.txt', header=True)
    nameList = [x['name'] for x in df.rdd.collect()]
    print(list(nameList))
    df.show()

if __name__ == '__main__':
    main()

实际输出:

[u'john']

所需的输出:

['j','o','h','n']

4 个答案:

答案 0 :(得分:5)

如果要使用python:

nameList = [c  for x in df.rdd.collect() for c in x['name']]

或者如果您想在火花中这样做:

from pyspark.sql import functions as F

df.withColumn('name', F.split(F.col('name'), '')).show()

结果:

+---+--------------+-----+----------+--------+
| id|          name|class|start_data|end_date|
+---+--------------+-----+----------+--------+
|  1|[j, o, h, n, ]|  xii|  20170909|20210909|
+---+--------------+-----+----------+--------+

答案 1 :(得分:0)

nameList = [x for x in 'john']

答案 2 :(得分:0)

.tolist()将熊猫系列转换为python列表,因此您应该首先根据数据创建一个列表,然后遍历所创建的列表。

namelist=df['name'].tolist()
for x in namelist:
    print(x)

答案 3 :(得分:0)

如果您在Spark Scala中执行此操作(火花2.3.1和scala-2.11.8) 下面的代码有效。 我们将获得一个额外的记录,该记录的名称为空,因此将其过滤。

导入spark.implicits._ val classDF = spark.sparkContext.parallelize(Seq((1,“ John”,“ Xii”,“ 20170909”,“ 20210909”))) .toDF(“ ID”,“名称”,“类”,“开始日期”,“结束日期”)

classDF.withColumn("Name", explode((split(trim(col("Name")), ""))))
  .withColumn("Start_Date", to_date(col("Start_Date"), "yyyyMMdd"))
  .withColumn("End_Date", to_date(col("End_Date"), "yyyyMMdd")).filter(col("Name").=!=("")).show