2017-04-07 93 views
1

我正在通过加载PySpark中的文本文件中的数据来创建RDD。现在我想将此RDD转换为dataframe,但我不知道RDD中有多少列和哪些列。我正在尝试使用createDataFrame(),并且显示的语法是sqlDataFrame = sqlContext.createDataFrame(rdd, schema)。我试图看看如何创建schema,但大多数示例显示了一个硬编码模式创建示例。现在,因为我不知道列是什么,所以我如何将rdd转换为dataframe?这是我到目前为止的代码:如何将PySpark RDD转换为具有未知列的数据框?

from pyspark import SQLContext 
sqlContext = SQLContext(sc) 

example_rdd = sc.textFile("\..\file1.csv") 
       .map(lambda line: line.split(",")) 

#convert the rdd into a dataframe 
# df = sc.createDataFrame() # dataframe conversion here. 

注1:我不知道列的原因是因为我想创建一个可以从RDD创建数据框一般脚本的文件中读取与任何列数。

注2:我知道有一个叫toDF()另一个函数,可以转换到RDD数据框,但同样我也有同样的问题,如何通过未知列wuth。

注意3:文件格式不只是一个csv文件。我已经展示了它的一个例子,但它可以是任何格式的任何文件

+0

为什么不为列名创建任意占位符?假设数据的预期维度是n列,那么对于范围(n)]中的'cols = [“col”.join(str(i))''。 – Jon

+0

另外,对于您的模式,当您将数据输入到脚本时,应该建立一种检测数据类型的方法,例如'types = [type(i)for i in data]',其中数据只是占位符你正在阅读的东西。 – Jon

+0

@Jon我怎么知道n的价值?我的意思是在文件中可以有10列,但在另一个文件中可以有15 – user2966197

回答

4

Spark 2.0.0以上版本支持将csv作为DataFrame直接读取。为了读取一个csv,使用DataFrameReader.csv方法

df = spark.read.csv("\..\file1.csv", header=True) 

在你的情况,如果你没有访问火花的对象,就可以使用,

from pyspark import SQLContext 
sqlContext = SQLContext(sc) 
df = sqlContext.read.csv("\..\file1.csv", header=True) 

如果文件中有不同分隔符,您也可以指定。

# Eg if separator is :: 
df = spark.read.csv("\..\file1.csv", head=True,sep="::") 
+0

,但csv不是我将要读取的唯一文件格式,这就是为什么我不使用read_csv()。 – user2966197

+0

你有权访问spark 2.0.0或更高版本吗?我可以提供一个代码示例。 –

+0

我无权访问2.0.0,但DataFrameReader.csv方法是否也读取非csv文件? – user2966197