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 识别为数字
如果您传递int
或float
(取决于您需要什么)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”
在 SPARK 2.1 中传递包含 ArrayType 列的 javaRDD 时,createDataFrame() 抛出异常
Scala Spark - 调用 createDataFrame 时获取重载方法