繁体   English   中英

在 PySpark 中读取 csv 文件

[英]Reading csv files in PySpark

我正在尝试读取 csv 文件并转换为数据帧。 输入文件

 4324,'Andy',43.5,20.3,53.21 

 2342,'Sam',22.1 

 3248,'Jane',11.05,12.87

 6457,'Bob',32.1,75.23,71.6

架构:Id、Name、Jan、Feb、March

如您所见,如果没有跟踪费用,则 csv 文件没有“,”。

代码:

from pyspark.sql.types import *
input1= sc.textFile('/FileStore/tables/input.txt').map(lambda x: x.split(","))

schema = StructType([StructField('Id',StringType(),True), StructField('Name',StringType(),True), StructField('Jan',StringType(),True), StructField('Feb',StringType(),True), StructField('Mar',StringType(),True)])

df3 = sqlContext.createDataFrame(input1, schema)

我得到 ValueError:对象长度 (4) 与字段长度 (5) 不匹配。 我该如何解决?

我会首先使用应该为您处理所有事情的熊猫导入文件。 然后,您可以将 Pandas DataFrame 转换为 spark 并执行所有常规操作。 我复制了您的示例 txt 文件并快速编写了一些代码以确认它可以正常工作:

import pandas as pd

# Reading in txt file as csv
df_pandas = pd.read_csv('<your location>/test.txt', 
                        sep=",")

# Converting to spark dataframe and displaying
df_spark = spark.createDataFrame(df_pandas)
display(df_pandas)

这产生了以下输出:

在此处输入图片说明

更快的方法是通过 spark 导入:

# Importing csv file using pyspark
csv_import = sqlContext.read\
                       .format('csv')\
                       .options(sep = ',', header='true', inferSchema='true')\
                       .load('<your location>/test.txt')


display(csv_import)

这给出了相同的输出。

from pyspark.sql.types import *

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("Test").getOrCreate()

fields = [StructField('Id', StringType(), True), StructField('Name', StringType(), True),
          StructField('Jan', StringType(), True), StructField('Feb', StringType(), True),
          StructField('Mar', StringType(), True)]

schema = StructType(fields)

data = spark.read.format("csv").load("test2.txt")

df3 = spark.createDataFrame(data.rdd, schema)
df3.show()

Output:

+----+------+-----+-----+-----+
|  Id|  Name|  Jan|  Feb|  Mar|
+----+------+-----+-----+-----+
|4324|'Andy'| 43.5| 20.3|53.21|
|2342| 'Sam'| 22.1| null| null|
|3248|'Jane'|11.05|12.87| null|
|6457| 'Bob'| 32.1|75.23| 71.6|
+----+------+-----+-----+-----+

这里有几个选项供您考虑。 这些使用通配符,因此您可以遍历所有文件夹和子文件夹,查找名称与特定模式匹配的文件,并将所有内容合并到一个 dingle 数据帧中。

val myDFCsv = spark.read.format("csv")
   .option("sep",",")
   .option("inferSchema","true")
   .option("header","true")
   .load("mnt/rawdata/2019/01/01/client/ABC*.gz")

myDFCsv.show()
myDFCsv.head()
myDFCsv.count()


//////////////////////////////////////////
// If you also need to load the filename
import org.apache.spark.sql.functions.input_file_name
val myDFCsv = spark.read.format("csv")
   .option("sep",",")
   .option("inferSchema","true")
   .option("header","true")
   .load("mnt/rawdata/2019/01/01/client/ABC*.gz")
   .withColumn("file_name",input_file_name())


myDFCsv.show(false)
myDFCsv.head()
myDFCsv.count()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM