Python 如何在Spark中分配和使用列标题?

Python 如何在Spark中分配和使用列标题?,python,hadoop,apache-spark,pyspark,multiple-columns,Python,Hadoop,Apache Spark,Pyspark,Multiple Columns,我正在阅读如下数据集 f = sc.textFile("s3://test/abc.csv") 我的文件包含50多个字段,我希望为每个字段分配列标题,以便稍后在脚本中引用 在Pypark中我该怎么做?DataFrame在这方面做得好吗 PS-新手火花 以下是如何使用DataFrame添加列名: f = sc.textFile("s3://test/abc.csv") data_rdd = f.map(lambda line: [x for x in line.split(',')]) 假设

我正在阅读如下数据集

 f = sc.textFile("s3://test/abc.csv")
我的文件包含50多个字段,我希望为每个字段分配列标题,以便稍后在脚本中引用

在Pypark中我该怎么做?DataFrame在这方面做得好吗


PS-新手火花

以下是如何使用DataFrame添加列名:

f = sc.textFile("s3://test/abc.csv")
data_rdd = f.map(lambda line: [x for x in line.split(',')])
假设您的csv具有分隔符“,”。在将数据传输到DataFrame之前,请按以下步骤准备数据:

f = sc.textFile("s3://test/abc.csv")
data_rdd = f.map(lambda line: [x for x in line.split(',')])
假设数据有3列:

data_rdd.take(1)
[[u'1.2', u'red', u'55.6']]
现在,您可以在使用
toDF()
将此RDD传输到数据帧时指定列名:

如果不指定列名,则会得到一个具有默认列名“_1”、“_2”、…”的数据帧:

df_default = data_rdd.toDF()

df_default.printSchema()

    root
     |-- _1: string (nullable = true)
     |-- _2: string (nullable = true)
     |-- _3: string (nullable = true)

这个问题的解决方案实际上取决于您运行的Spark版本。假设您使用的是Spark 2.0+,那么您可以将CSV作为数据帧读入,并使用toDF添加列,这有助于将RDD转换为数据帧或向现有数据帧添加列

filename = "/path/to/file.csv"
df = spark.read.csv(filename).toDF("col1","col2","col3")
f=sc.textFile(“s3://test/abc.csv”)
header=f.first() 标题将为您提供以下信息:-
u'col1,col2,col3'-->例如,取3列名称 head=str(header)。拆分(“,”)
head会给你一个列表
['col1','col2','col3'] fDF=f.filter(lambda行:行!=header).map(lambda x:str(x).split(“,”).toDF(head)
fdF.show()

将根据需要为您提供标题以及数据框中的数据。

这里的数据框是正确的吗?-是的。或者
namedtuple
,如果您计划使用大量普通Python代码。DataFrame是模式和rdd的组合。现在代码中的变量“f”是rdd。所以,如果您向其添加模式,您将获得DataFrame。然后它将有标题和列名。此外,还可以将此数据注册为表,并在其上执行SQL。
f = sc.textFile("s3://test/abc.csv") <br />
header = f.first()

header will give you as below:-<br />
u'col1,col2,col3'  --> for example taking 3 columns name

head = str(header).split(",") <br />
head will give you a list<br/>
['col1','col2','col3']

fDF = f.filter(lambda row: row!=header).map(lambda x: str(x).split(",")).toDF(head)<br/>
fdF.show() <br/>