Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在spark数据帧中使用arraytype_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 在spark数据帧中使用arraytype

Scala 在spark数据帧中使用arraytype,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我的要求是将DataFrame中的所有十进制数据类型转换为字符串。逻辑可以很好地处理简单类型,但不能处理ArrayType。 以下是逻辑:- var df = spark.sql("select * from test_1") for(dt <- df.dtypes) { if(dt._2.substring(0,7) == "Decimal"){ df = df.withColumn(dt._1,df(dt._1).cast("String")) } } var d

我的要求是将DataFrame中的所有十进制数据类型转换为字符串。逻辑可以很好地处理简单类型,但不能处理ArrayType。 以下是逻辑:-

var df = spark.sql("select * from test_1")
for(dt <- df.dtypes) {
  if(dt._2.substring(0,7) == "Decimal"){
    df = df.withColumn(dt._1,df(dt._1).cast("String"))  
  }
}
var df=spark.sql(“从测试1中选择*)
对于(dt df.schema res77:org.apache.spark.sql.types.StructType=
StructType(StructField(mstr\u prov\u id,StringType,true),
StructField(prov_ctgry_cd,StringType,true),
结构字段(prov_orgnl_efctv_dt,TimestampType,true),
StructField(prov_trmntn_dt,TimestampType,true),
StructField(prov_trmntn_rsn_cd,StringType,true),
StructField(npi_rqrd_ind,StringType,true),
StructField(prov_stts_aray_txt,ArrayType)(StructType,StructField(prov_stts_KEY,DecimalType(22,0),true),
StructField(PROV_STTS_EFCTV_DT,TimestampType,true),
StructField(PROV_STTS_CD,StringType,true),
结构字段(PROV_STTS_TRMNTN_DT,TimestampType,true),
结构字段(PROV_STTS_TRMNTN_RSN_CD,StringType,true)),true),true)


您还可以强制转换复杂类型,例如,如果您有类似于此模式的数据帧:

root
 |-- arr: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- i: decimal(22,0) (nullable = true)
 |    |    |-- j: double (nullable = false)
通过执行以下操作,可以强制转换所有十进制类型的数组元素(本例中为field
i
n):

df
  .select($"arr".cast("array<struct<i:string,j:double>>"))
  .printSchema()

root
 |-- arr: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- i: string (nullable = true)
 |    |    |-- j: double (nullable = true)

如果您使用的是spark 2.1及以上版本,则以下铸造应该适合您

val newSchema = DataType.fromJson(df.schema.json.replaceAll("(decimal\\(\\d+,\\d+\\))", "string")).asInstanceOf[StructType]
df.select(newSchema.map(field => col(field.name).cast(field.dataType)): _*)
它应该将所有十进制类型转换为字符串类型

但是,如果您使用的spark版本低于上述版本,并且由于struct列中有timestamp数据类型,您将遇到

TimestampType(类org.apache.spark.sql.types.TimestampType$)
scala.MatchError:TimestampType(类org.apache.spark.sql.types.TimestampType$)

这是一个已解决的问题

试试这个(与==的比较可能不是您想要的)

var df=spark.sql(“从测试1中选择*)

对于(dt您必须编写一个UDF,将数组中的每个十进制数转换为字符串。这是因为列的类型是十进制数组。您可以共享此要求的示例代码吗?我正在寻找实现此任务的UDF。即使我知道,我也需要一个UDF,它将遍历数组元素,并将所有十进制类型转换为string.Bu我不知道如何编写该代码。因此,寻找示例代码(UDF)同样,你想将prov_stts_aray_txt列中的所有数据都更改为string?是这样吗?@RameshMaharjan,prov_stts_aray_txt中只有十进制类型的字段必须转换为string。我尝试了很多,但找不到任何线索。这不是我的要求。我必须循环arrayType的元素,并强制转换所有十进制类型的to String Type…@Vinitkumar,为什么您需要循环?我必须将所有十进制类型转换为String。而且在ArrayType中有一些字段是十进制的。在同一行中还有一个帮助,我可以迭代平面字段并执行诸如replace之类的操作。但是它不是迭代嵌套字段。我如何迭代字段包括嵌套字段并根据需要执行表达式…提前感谢..上述解决方案适用于所有十进制数据类型,即使是嵌套结构和数组类型中的数据类型。在回答之前,我自己确认了:)
val newSchema = DataType.fromJson(df.schema.json.replaceAll("(decimal\\(\\d+,\\d+\\))", "string")).asInstanceOf[StructType]
df.select(newSchema.map(field => col(field.name).cast(field.dataType)): _*)
var df = spark.sql("select * from test_1")
for(dt <- df.dtypes) {
  if("Decimal".equalsIgnoreCase(dt._2.substring(0,Math.min(7, dt._2.length)))){
    df = df.withColumn(dt._1,df(dt._1).cast("String"))  
  }
}