我已经使用 pyspark 将一个 csv 文件导入到 Spark 中.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"的列,其值如下:
美国>TX>618
美国>新泽西州>241
美国>新泽西州
我的问题是,如何将这些文本值转换为数值?在SQL还是PySpark.sql?
在熊猫中,我会这样做
df["geo_location_categories"] = df["geo_location"].astype('category')
df["geo_location_codes"] = df["geo_location_categories"].cat.codes
从我的角度来看,有几种方法可以解决您的问题。如果您只需要将"geo_location"列转换为数字列 - 您可以使用 UDF。你可以通过以下方式定义UDF(对不起,Scala中的代码):
val toInt = udf[Int, String](str => {
// convert your geo location string into integer using existing business logic
})
之后,您可以通过以下方式使用此 UDF:
var df = spark_df.withColumn("geo_location_codes", toInt(spark_df("geo_location")))
另外,我认为应该可以使用UserDefinedType作为列类型。但是,这取决于您使用的 Spark 版本。有关详细信息,请查看此问题:如何在 Spark SQL 中为自定义类型定义架构?
我希望这些信息对您有用。