如何在Spark中解析java_method返回的Locale.getISOCountries数组?
解决Spark中java_method调用Locale.getISOCountries返回数组无法正常解析的问题
你的推测完全正确:Locale.getISOCountries()返回的是Java字符串数组String[],而Currency.getAvailableCurrencies()返回的是Set<Currency>集合。Spark的java_method对Java集合类型的序列化支持更友好,会自动转换为Spark可识别的集合格式,但对数组类型直接返回了Java数组的默认字符串表示(也就是[Ljava.lang.String;@xxx)。
要解析这个数组得到正常的国家列表,有两种简单的处理方式:
方法1:将数组转为List集合
利用java.util.Arrays.asList()方法把返回的数组转换成List集合,这样就能被Spark正确序列化:
from pyspark.sql import functions as F df = spark.range(1).select( # 先调用getISOCountries得到数组,再用Arrays.asList转为List F.expr("java_method('java.util.Arrays', 'asList', java_method('java.util.Locale', 'getISOCountries'))").alias('countries'), F.expr("java_method('java.util.Currency', 'getAvailableCurrencies')").alias('currencies'), ) df.show(truncate=0)
方法2:自定义UDF解析数组
如果需要更灵活的处理,可以自定义UDF来直接解析Java数组:
from pyspark.sql import functions as F from pyspark.sql.types import ArrayType, StringType import java.util.Locale # 自定义UDF获取ISO国家列表 def get_iso_countries(): return Locale.getISOCountries() get_countries_udf = F.udf(get_iso_countries, ArrayType(StringType())) df = spark.range(1).select( get_countries_udf().alias('countries'), F.expr("java_method('java.util.Currency', 'getAvailableCurrencies')").alias('currencies'), ) df.show(truncate=0)
两种方法都能得到正常的国家代码数组,比如[AD, AE, AF, AG, AI, AL, AM, AO, AQ, AR, AS, AT, AU, AW, AX, AZ, ...]这样的格式。
内容的提问来源于stack exchange,提问作者ZygD
相关产品推荐
相关产品推荐

