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

daupos2t  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(394)

我正在阅读如下数据集。

f = sc.textFile("s3://test/abc.csv")

我的文件包含50多个字段,我想为每个字段分配列标题,以便稍后在脚本中引用。
在Pypark我该怎么做?dataframe在这方面做得好吗?
ps-新手的Spark。

yyhrrdl8

yyhrrdl81#

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/>

将根据需要提供Dataframe中的头和数据。

3duebb1j

3duebb1j2#

下面是如何使用dataframe添加列名:
假设您的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']]

现在,您可以在使用将此rdd传输到dataframe时指定列名 toDF() :

df_withcol = data_rdd.toDF(['height','color','width'])

df_withcol.printSchema()

    root
     |-- height: string (nullable = true)
     |-- color: string (nullable = true)
     |-- width: string (nullable = true)

如果不指定列名,则会得到一个具有默认列名“\u 1”、“\u 2”、…:

df_default = data_rdd.toDF()

df_default.printSchema()

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

b4lqfgs43#

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

filename = "/path/to/file.csv"
df = spark.read.csv(filename).toDF("col1","col2","col3")

相关问题