CreateDataFrame 或 SaveAsTable 在 pyspark 1.6 中直观地编码

Posted

技术标签:

【中文标题】CreateDataFrame 或 SaveAsTable 在 pyspark 1.6 中直观地编码【英文标题】:CreateDataFrame or SaveAsTable intuitively encode in pyspark 1.6 【发布时间】:2016-09-01 20:54:24 【问题描述】:

我正在尝试使用 pyspark 在 spark1.6 中保存一个表。所有表格列都保存为文本,我想知道是否可以更改:

product = sc.textFile('s3://path/product.txt') 
product = m3product.map(lambda x: x.split("\t"))
product = sqlContext.createDataFrame(product, ['productid', 'marketID', 'productname', 'prod'])
product.saveAsTable("product", mode='overwrite')

最后 2 个命令中是否有可以自动将 productid 和 marketid 识别为数字的东西?我有很多文件和很多字段要上传,所以理想情况下它会是自动的

【问题讨论】:

可能传递了一个模式? 【参考方案1】:

最后 2 个命令中是否有一些东西可以自动将 productid 和 marketid 识别为数字

如果您传递intfloat(取决于您需要什么)pyspark 将为您转换数据类型。

在您的情况下,更改 lambda 函数

product = m3product.map(lambda x: x.split("\t"))
product = sqlContext.createDataFrame(product, ['productid', 'marketID', 'productname', 'prod'])

from pyspark.sql.types import Row

def split_product_line(line):
    fields = line.split('\t')

    return Row(
        productid=int(fields[0]),
        marketID=int(fields[1]),
...
    )

product = m3product.map(split_product_line).toDF()

您会发现控制数据类型和可能的错误/异常检查要容易得多。

Try to prohibit lambda functions 如果可能的话:)

【讨论】:

谢谢你。您介意在 productid 下扩展...吗?我应该为字符字段做 char(fields[0]) 还是这只是数字?我试图找到这方面的文档,但无法找到。 查看我的编辑。 split 提供字符串,因此如果您只需要字符串,则无需进行转换,例如,productname=fields[2]

以上是关于CreateDataFrame 或 SaveAsTable 在 pyspark 1.6 中直观地编码的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:SQLContext 实例没有属性“createDataFrame”

未绑定方法 createDataFrame()

在 SPARK 2.1 中传递包含 ArrayType 列的 javaRDD 时,createDataFrame() 抛出异常

Scala Spark - 调用 createDataFrame 时获取重载方法

使用 sparkSession.createDataFrame 以 parquet 格式一次将多行写入 s3

spark 从RDD createDataFrame 的坑