从PySp文件中正确读取类型

2024-09-19 21:00:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个制表符分隔的文件,其中包含

id1 name1   ['a', 'b']  3.0 2.0 0.0 1.0

也就是说,一个id、一个名称、一个包含一些字符串的列表和一系列4个float属性。 我把这个文件读作

^{pr2}$

我给出的模式是

schema = StructType([
    StructField('id', StringType(), True),
    StructField('name', StringType(), True),
    StructField('list', ArrayType(StringType()), True),
    StructField('att1', FloatType(), True),
    StructField('att2', FloatType(), True),
    StructField('att3', FloatType(), True),
    StructField('att4', FloatType(), True)
])

问题是,从数据帧上的collect判断,列表和属性都不能正确读取。事实上,我得到了None

Row(id=u'id1', brand_name=u'name1', list=None, att1=None, att2=None, att3=None, att4=None)

我做错什么了?在


Tags: 文件namenoneidtrue列表属性list
1条回答
网友
1楼 · 发布于 2024-09-19 21:00:55

这本书读得很好,只是不像你所期望的那样有效。Schema参数声明了是什么类型,以避免昂贵的模式推断,而不是如何转换数据。提供与声明的架构匹配的输入是您的责任。在

这也可以由数据源来处理(看一下spark-csvinferSchema选项)。但它不能处理像数组这样的复杂类型。在

由于您的架构基本上是平面的,并且您知道类型,因此可以尝试如下操作:

df = rdd.toDF([f.name for f in schema.fields])

exprs = [
    # You should excluding casting
    # on other complex types as well
    col(f.name).cast(f.dataType) if f.dataType.typeName() != "array" 
    else col(f.name)
    for f in schema.fields
]

df.select(*exprs)

并使用字符串处理函数或UDF分别处理复杂类型。或者,由于您无论如何都是用Python读取数据的,所以只需在创建DF之前强制执行所需的类型。在

相关问题 更多 >