我正在尝试将Spark RDD转换为DataFrame。我已经看到了将方案传递给sqlContext.CreateDataFrame(rdd,schema)函数的文档和示例 。
sqlContext.CreateDataFrame(rdd,schema)
但是我有38列或字段,并且这将进一步增加。如果我手动给出指定每个字段信息的架构,那将是一件非常繁琐的工作。
还有其他方法可以指定模式,而无需事先了解各列的信息。
看到,
在Spark中有两种将RDD转换为DF的方法。
toDF() 和 createDataFrame(rdd, schema)
toDF()
createDataFrame(rdd, schema)
我将向您展示如何动态地做到这一点。
该toDF()命令为您提供了将转换RDD[Row]为数据框的方法。关键是,对象Row()可以接收**kwargs参数。因此,有一种简单的方法可以做到这一点。
RDD[Row]
Row()
**kwargs
from pyspark.sql.types import Row #here you are going to create a function def f(x): d = {} for i in range(len(x)): d[str(i)] = x[i] return d #Now populate that df = rdd.map(lambda x: Row(**f(x))).toDF()
这样,您将能够动态创建数据框。
完成此操作的另一种方法是创建动态模式。怎么样?
这条路:
from pyspark.sql.types import StructType from pyspark.sql.types import StructField from pyspark.sql.types import StringType schema = StructType([StructField(str(i), StringType(), True) for i in range(32)]) df = sqlContext.createDataFrame(rdd, schema)
第二种方法更清洁…
这样便可以动态创建数据框。