有人可以指导我将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来映射架构,以便我可以在列级别进行进一步处理。
此外,如果您认为有更好的方法,请建议。 如果需要更多详细信息,请回复。
谢谢。
答案 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)
请注意,可以使用其他选项推断架构,但这需要在加载数据帧之前读取整个文件。