2017-01-26 62 views
0

我已经导入CSV文件到使用pyspark.sql火花,并通过它注册为一个临时表:如何从字符串值中获取数字代码?

import pyspark 
from pyspark.sql import SQLContext 
sc = pyspark.SparkContext() 
from pyspark.sql import HiveContext 

sqlCtx= HiveContext(sc) 
spark_df = sqlCtx.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load("./data/geo_file.csv") 
spark_df.registerTempTable("geo_table") 

在表“geo_table”有一个叫“geo_location”有值,如柱:

US> TX> 618

US> NJ> 241

US> NJ

我的问题是,如何将这些文本值转换为数值?在SQL或pyspark.sql?

在熊猫,我会做这个

df["geo_location_categories"] = df["geo_location"].astype('category') 
df["geo_location_codes"] = df["geo_location_categories"].cat.codes 

回答

0

从我的角度来看,有几种方法可以解决你的问题。如果您只需将“geo_location”列转换为数字列,则可以使用UDF。您可以通过以下方式定义UDF(对不起,Scala代码):

var df = spark_df.withColumn("geo_location_codes", toInt(spark_df("geo_location"))) 

此外,我认为应该是可能的:

val toInt = udf[Int, String](str => { 
    // convert your geo location string into integer using existing business logic 
}) 

之后,你可以通过以下方式使用UDF使用UserDefinedType作为列类型。但是,它取决于您使用的Spark版本。看看这个问题的更多信息:How to define schema for custom type in Spark SQL?

我希望你会觉得这些信息有用。

相关问题