Pyspark:将PythonRDD转换为Dataframe

时间:2016-07-12 05:22:22

标签: apache-spark pyspark

有人可以指导我将PythonRDD转换为DataFrame。

根据我的理解,读取文件应该创建一个DF,但在我的情况下,它创建了一个PythonRDD。我发现很难将PythonRDD转换为DataFrame。找不到CreateDataFrame()或toDF()。

请找到我的以下代码,以阅读标签分隔的文本文件:

rdd1 = sparkCxt.textFile(setting.REFRESH_HDFS_DIR + "/Refresh")
rdd2 = rdd1.map(lambda row: unicode(row).lower().strip()\
                    if type(row) == unicode else row)

现在,我想将PythonRDD转换为DF。 我想转换为DF来映射架构,以便我可以在列级别进行进一步处理。

此外,如果您认为有更好的方法,请建议。 如果需要更多详细信息,请回复。

谢谢。

3 个答案:

答案 0 :(得分:1)

Spark DataFrames可以直接从文本文件创建,但是您应该使用sqlContext而不是sc(SparkContext),因为sqlContext是使用DataFrames的入口点。

df = sqlContext.read.text('path/to/my/file')

这将创建一个名为 value 的列的DataFrame。您可以使用UDF函数将其拆分为必需的列。

另一种方法是将文本文件读取到RDD,使用map,reduce,filter和其他操作将其拆分为列,然后将最终的RDD转换为DataFrame。

例如,我们假设我们有一个名为 my_rdd 的RDD,结构如下:

  

[(1,' Alice',23),(2,' Bob',25)]

我们可以轻松将其转换为DataFrame:

df = sqlContext.createDataFrame(my_rdd, ['id', 'name', 'age'])

其中id,name和age是我们列的名称。

答案 1 :(得分:0)

您可以尝试使用toPandas(),但这样做时应谨慎,因为将rdd转换为pandas DataFrame就像将所有数据都带入内存,如果分布式数据很大,可能会导致OOM错误。

答案 2 :(得分:0)

我会使用Spark-csv包(Spark-csv Github)并在定义架构后直接导入数据帧。

例如:

from pyspark.sql import SQLContext
from pyspark.sql.types import *

sqlContext = SQLContext(sc)
customSchema = StructType([ \
    StructField("year", IntegerType(), True), \
    StructField("make", StringType(), True), \
    StructField("model", StringType(), True), \
    StructField("comment", StringType(), True), \
    StructField("blank", StringType(), True)])

df = sqlContext.read \
    .format('com.databricks.spark.csv') \
    .options(header='true') \
    .load('cars.csv', schema = customSchema)

默认为分隔符的逗号,但您可以将其更改为包含以下内容的选项卡:

df = sqlContext.read \
    .format('com.databricks.spark.csv') \
    .options(header='true', delimiter='\t') \
    .load('cars.csv', schema = customSchema)

请注意,可以使用其他选项推断架构,但这需要在加载数据帧之前读取整个文件。

相关问题