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

时间:2016-04-13 20:07:33

标签: python hadoop apache-spark pyspark multiple-columns

我正在阅读如下数据集。

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

我的文件包含50多个字段,我希望为每个字段指定列标题,以便稍后在我的脚本中引用。

我如何在PySpark中做到这一点? DataFrame是这样的吗?

PS - Spark的新手。

3 个答案:

答案 0 :(得分:5)

以下是使用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']]

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

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

df_withcol.printSchema()

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

如果您没有指定列名称,则会获得一个具有默认列名称的数据框架' _1',' _2',...:

df_default = data_rdd.toDF()

df_default.printSchema()

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

答案 1 :(得分:4)

此问题的解决方案实际上取决于您正在运行的Spark的版本。假设您使用的是Spark 2.0+,那么您可以将CSV作为DataFrame读取并添加带有toDF的列,这有利于将RDD转换为DataFrame或将列添加到现有数据框。

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

答案 2 :(得分:0)

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

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