我正在尝试将Spark RDD转换为DataFrame。 我已经查看了文档和示例,其中方案被传递给sqlContext.CreateDataFrame(rdd,schema)
函数。
但是我有38个列或字段,而且这个数量还会进一步增加。如果我手动给出方案并指定每个字段的信息,那么这将是一项非常繁琐的工作。
是否有其他方法可以在不事先知道列信息的情况下指定模式?
我正在尝试将Spark RDD转换为DataFrame。 我已经查看了文档和示例,其中方案被传递给sqlContext.CreateDataFrame(rdd,schema)
函数。
但是我有38个列或字段,而且这个数量还会进一步增加。如果我手动给出方案并指定每个字段的信息,那么这将是一项非常繁琐的工作。
是否有其他方法可以在不事先知道列信息的情况下指定模式?
看,
在Spark中将RDD转换为DataFrame有两种方法。
toDF()
和createDataFrame(rdd, schema)
我会向您展示如何以动态方式执行此操作。
toDF()
命令提供了一种将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)
第二种方法更加清晰易懂...
这就是如何动态创建数据框。
我更喜欢Arun的答案,但有一个小问题,我无法评论或编辑该答案。sparkContext没有createDeataFrame函数,而sqlContext有(正如Thiago所提到的)。因此:
from pyspark.sql import SQLContext
# assuming the spark environemnt is set and sc is spark.sparkContext
sqlContext = SQLContext(sc)
schemaPeople = sqlContext.createDataFrame(RDDName)
schemaPeople.createOrReplaceTempView("RDDName")
from pyspark.sql import SparkSession
,spark = SparkSession.builder.getOrCreate()
,spark.createDataFrame(...)
- Timsc = spark.sparkContext
# Infer the schema, and register the DataFrame as a table.
schemaPeople = spark.createDataFrame(RddName)
schemaPeople.createOrReplaceTempView("RddName")