我想知道如何从名称中有空格的Row
访问属性。
例如,我有这个Row
对象
Row(ONE CATEGORY=u'category')
如何访问ONE CATEGORY
值。通常我会使用row.oneCategory
来访问它,但在这种情况下由于空格而无法实现。如果可能的话,我更喜欢Python中的建议。
由于
答案 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;用``。