Spark - 如何处理名称中包含空格的列

时间:2015-09-03 02:03:48

标签: apache-spark apache-spark-sql

我想知道如何从名称中有空格的Row访问属性。

例如,我有这个Row对象

Row(ONE CATEGORY=u'category') 

如何访问ONE CATEGORY值。通常我会使用row.oneCategory来访问它,但在这种情况下由于空格而无法实现。如果可能的话,我更喜欢Python中的建议。

由于

3 个答案:

答案 0 :(得分:2)

在Python中可以使用getattr函数:

row = Row("ONE CATEGORY")("category")
row
## Row(ONE CATEGORY='category')
getattr(row, u"ONE CATEGORY")
## 'category'

Row.asDict方法:

row.asDict()["ONE CATEGORY"]
## 'category'

由于您无法在Scala中使用点语法,因此这不是一个问题,但如果您想按名称访问字段,则可以使用Row.getAs

val row = sc.parallelize(Tuple1("category") :: Nil).toDF("ONE CATEGORY").first
row.getAs[String]("ONE CATEGORY")

Row.getValuesMap

row.getValuesMap[String](Seq("ONE CATEGORY"))("ONE CATEGORY")

在Python和Scala中,您都可以通过索引访问值:

## row[0]
'category'
row(0)
// Any = category
row.getString(0)
// String = category

最后,您可以在选择期间使用alias方法完全避免此问题:

df.select(col("ONE CATEGORY").alias("ONE_CATEGORY"))

答案 1 :(得分:0)

您可以替换空格或任何不需要的字符,例如:

import re
import pyspark
import pyspark.sql.functions as sf

def format_colname(text):
    rep = {" ": "", ".": "", "_":""} # define desired replacements here
    # format : {<remove-this-pattern> : <insert-this-pattern> }

    # use these three lines to do the replacement
    rep = dict((re.escape(k), v) for k, v in rep.iteritems())
    pattern = re.compile("|".join(rep.keys()))
    text = pattern.sub(lambda m: rep[re.escape(m.group(0))], text)
    return text

exprs = [sf.col(column).alias(format_colname(column)) for column in data.columns]
print(exprs)

data = data.select(*exprs)

或者如果您只有一种模式

 exprs = [sf.col(column).alias(column.replace(" ", "") for column in data.columns]
 data = data.select(*exprs)

答案 2 :(得分:-1)

如果您使用SQL,则可以使用

``

显示中间有空格的列。 请确保你不要混淆&#39;&#39;用``。