Guia de migração para o Databricks Runtime 7.x (EoS)
Observação
O suporte para esta versão do Databricks Runtime foi encerrado. Para obter a data de fim do suporte, consulte o Histórico de fim do suporte. Para ver todas as versões compatíveis do Databricks Runtime, consulte Versões de notas de versão do Databricks Runtime e compatibilidade.
Este guia fornece orientação para ajudá-lo a migrar suas cargas de trabalho do Azure Databricks do Databricks Runtime 6.x, criado no Apache Spark 2.4, para o Databricks Runtime 7.3 LTS (EoS), ambos criados no Spark 3.0.
Este guia lista as alterações de comportamento do Spark 3.0 que podem exigir que você atualize as cargas de trabalho do Azure Databricks. Algumas dessas alterações incluem a remoção completa do suporte ao Python 2, a atualização para o Scala 2.12, o suporte completo ao JDK 11 e a mudança do calendário gregoriano para o proléptico em datas e carimbos de data/hora.
Este guia é um complemento do guia de migração do Databricks Runtime 7.3 LTS (EoS).
Novos recursos e aprimoramentos disponíveis no Databricks Runtime 7.x
Para obter uma lista de novos recursos, melhorias e atualizações de biblioteca incluídos no Databricks Runtime 7.3 LTS, consulte as notas sobre a versão de cada versão do Databricks Runtime acima daquela da qual você está migrando. As versões do Databricks Runtime 7.x com suporte incluem:
As atualizações de manutenção pós-lançamento são listadas nas Atualizações de Manutenção do Databricks Runtime (arquivado).
Ambiente do sistema Databricks Runtime 7.3 LTS
- Sistema operacional: Ubuntu 18.04.5 LTS
- Java:
- 7.3 LTS: Zulu 8.48.0.53-CA-linux64 (build 1.8.0_265-b11)
- Scala: 2.12.10
- Python: 3.7.5
- R: 3.6.3 (2020-02-29)
- Delta Lake 0.7.0
Principais alterações de comportamento do Apache Spark 3.0
As alterações de comportamento a seguir do Spark 2.4 para o Spark 3.0 podem exigir que você atualize cargas de trabalho do Azure Databricks na migração do Databricks Runtime 6.x para o Databricks Runtime 7.x.
Observação
Este artigo fornece uma lista das alterações de comportamento do Spark importantes que você deve considerar ao migrar para o Databricks Runtime 7.x.
Núcleo
- No Spark 3.0, o acumulador v1 preterido foi removido.
- O arquivo de log de eventos será gravado como codificação UTF-8 e o Servidor de Histórico do Spark repetirá os arquivos de log de eventos como codificação UTF-8. Anteriormente, o Spark gravava o arquivo de log de eventos como um conjunto de caracteres padrão do processo de JVM do driver e, portanto, o Servidor de Histórico do Spark 2.x é necessário para ler os arquivos de log de eventos antigos em caso de codificação incompatível.
- Um novo protocolo para buscar blocos de ordem aleatória é usado. É recomendável que os serviços de embaralhamento externos sejam atualizados na execução de aplicativos Spark 3.0. Você ainda pode usar serviços de embaralhamento externos antigos quando define a configuração
spark.shuffle.useOldFetchProtocol
comotrue
. Caso contrário, o Spark poderá ter erros com mensagens comoIllegalArgumentException: Unexpected message type: <number>
.
PySpark
- No Spark 3.0,
Column.getItem
corrigido de forma a não chamarColumn.apply
. Consequentemente, seColumn
for usado como um argumento paragetItem
, o operador de indexação deverá ser usado. Por exemplo,map_col.getItem(col('id'))
deve ser substituído pormap_col[col('id')]
. - A partir do Spark 3.0, os nomes de campo de
Row
não são mais classificados por ordem alfabética na construção com argumentos nomeados para as versões 3.6 e superiores do Python, e a ordem dos campos corresponderá à que foi inserida. Para habilitar campos classificados por padrão, como no Spark 2.4, defina a variável de ambientePYSPARK_ROW_FIELD_SORTING_ENABLED
comotrue
para executores e driver. Essa variável de ambiente precisa ser consistente para todos os executores e driver. Caso contrário, poderá causar falhas ou respostas incorretas. Para versões do Python inferiores à 3.6, os nomes de campo são classificados em ordem alfabética como a única opção. - Suporte ao Python 2 preterido (SPARK-27884).
Streaming estruturado
- No Spark 3.0, o Streaming Estruturado força a anulabilidade do esquema de origem quando fontes de dados baseadas em arquivos como texto, json, csv, parquet e orc são usadas por meio de
spark.readStream(...)
. Anteriormente, ele respeitava a nulidade no esquema de origem; no entanto, isso causou problemas complicados na depuração com o NPE. Para restaurar o comportamento anterior, definaspark.sql.streaming.fileSource.schema.forceNullable
comofalse
. - O Spark 3.0 corrige o problema de exatidão na junção externa stream-stream, o que altera o esquema do estado. Confira SPARK-26154 para obter mais detalhes. Se você iniciar a consulta do ponto de verificação construído pelo Spark 2.x que usa a junção externa stream-stream, o Spark 3.0 falhará na consulta. Para recalcular saídas, descarte o ponto de verificação e reproduza as entradas anteriores.
- No Spark 3.0, a classe preterida
org.apache.spark.sql.streaming.ProcessingTime
foi removida. Useorg.apache.spark.sql.streaming.Trigger.ProcessingTime
em vez disso. Da mesma forma,org.apache.spark.sql.execution.streaming.continuous.ContinuousTrigger
foi removido em favor deTrigger.Continuous
eorg.apache.spark.sql.execution.streaming.OneTimeTrigger
foi ocultado em favor deTrigger.Once
. Confira SPARK-28199.
SQL, conjuntos de dados e DataFrame
- No Spark 3.0, ao inserir um valor em uma coluna de tabela com um tipo de dados diferente, a coerção de tipo será executada de acordo com o padrão de SQL ANSI. Algumas conversões de tipo inaceitável, como a conversão
string
deint
edouble
paraboolean
, não são permitidas. Uma exceção de runtime será lançada se o valor estiver fora do intervalo para o tipo de dados da coluna. No Spark versão 2.4 e anteriores, as conversões de tipo durante a inserção da tabela são permitidas, desde que sejamCast
válidas. Ao inserir um valor fora do intervalo em um campo integral, os bits de ordem inferior do valor serão inseridos (igual à conversão de tipo numérico Java/Scala). Por exemplo, se 257 for inserido em um campo de tipo de byte, o resultado será 1. O comportamento é controlado pela opçãospark.sql.storeAssignmentPolicy
, com um valor padrão como “ANSI”. A configuração da opção como “Herdada” restaura o comportamento anterior. - No Spark 3.0, ao converter o valor da cadeia de caracteres em tipos integrais (tinyint, smallint, int e bigint), tipos datetime (date, timestamp e interval) e tipo booliano, os espaços em branco à frente e à direita (<= ACSII 32) serão cortados antes de serem convertidos nesses valores de tipo, por exemplo,
cast(' 1\t' as int)
retorna1
,cast(' 1\t' as boolean)
retornatrue
,cast('2019-10-10\t as date)
retorna o valor de data2019-10-10
. No Spark versão 2.4 e anteriores, ao fazer a transmissão de cadeia de caracteres para integrais e boolianos, ele não cortará os espaços em branco de ambas as extremidades. Os resultados anteriores serãonull
; já para datetimes, somente os espaços à direita (= ASCII 32) serão removidos. Consulte https://databricks.com/blog/2020/07/22/a-comprehensive-look-at-dates-and-timestamps-in-apache-spark-3-0.html. - No Spark 3.0, os métodos preteridos
SQLContext.createExternalTable
eSparkSession.createExternalTable
foram preteridos em favor de sua substituição,createTable
. - No Spark 3.0,
spark.sql.crossJoin.enabled
de configuração se torna configuração interna e isso é verdadeiro por padrão, ou seja, por padrão, o Spark não lançará uma exceção no SQL com uniões cruzadas implícitas. - No Spark 3.0, invertemos a ordem do argumento da função trim de
TRIM(trimStr, str)
paraTRIM(str, trimStr)
a fim de deixá-lo compatível com outros bancos de dados. - No Spark versão 2.4 e anteriores, as consultas SQL, por exemplo,
FROM <table>
ouFROM <table> UNION ALL FROM <table>
, têm suporte acidentalmente. No estilo doFROM <table> SELECT <expr>
do Hive, a cláusulaSELECT
não é insignificante. O Hive e o Presto não dão suporte a essa sintaxe. Portanto, trataremos essas consultas como inválidas a partir do Spark 3.0. - Desde o Spark 3.0, o Conjunto de dados e a API DataFrame
unionAll
não foram mais preteridos. É um alias paraunion
. - No Spark versão 2.4 e anteriores, o analisador da fonte de dados JSON trata cadeias de caracteres vazias como nulas para alguns tipos de dados, como
IntegerType
. ParaFloatType
eDoubleType
, ele falha em cadeias de caracteres vazias e lança exceções. Desde o Spark 3.0, não podemos permitir cadeias de caracteres vazias e lançamos exceções para tipos de dados que não sejamStringType
eBinaryType
. - Desde o Spark 3.0, as funções
from_json
dão suporte a dois modos:PERMISSIVE
eFAILFAST
. Os modos podem ser definidos por meio da opçãomode
. O modo padrão se tornouPERMISSIVE
. Nas versões anteriores, o comportamento defrom_json
não estava em conformidade comPERMISSIVE
nem comFAILFAST,
, especialmente no processamento de registros JSON malformados. Por exemplo, a cadeia de caracteres JSON{"a" 1}
com o esquemaa INT
é convertida emnull
por versões anteriores, mas o Spark 3.0 a converte emRow(null)
.
Instruções DDL
- No Spark 3.0,
CREATE TABLE
sem um provedor específico usa o valor despark.sql.sources.default
como seu provedor. No Spark versão 2.4 e inferior, era o Hive. Para restaurar o comportamento antes do Spark 3.0, você pode definirspark.sql.legacy.createHiveTableByDefault.enabled
comotrue
. - No Spark 3.0, ao inserir um valor em uma coluna de tabela com um tipo de dados diferente, a coerção de tipo será executada de acordo com o padrão de SQL ANSI. Algumas conversões de tipo inaceitável, como a conversão
string
deint
edouble
paraboolean
, não são permitidas. Uma exceção de runtime é lançada se o valor está fora do intervalo para o tipo de dados da coluna. No Spark versão 2.4 e inferiores, as conversões de tipo durante a inserção da tabela são permitidas, desde que sejamCast
válidas. Ao inserir um valor fora do intervalo em um campo integral, os bits de ordem inferior do valor serão inseridos (igual à conversão de tipo numérico Java/Scala). Por exemplo, se 257 for inserido em um campo de tipo de byte, o resultado será 1. O comportamento é controlado pela opçãospark.sql.storeAssignmentPolicy
, com um valor padrão como “ANSI”. A configuração da opção como “Herdada” restaura o comportamento anterior. - No Spark 3.0,
SHOW CREATE TABLE
sempre retorna a DDL do Spark, mesmo quando a tabela fornecida é uma tabela SerDe do Hive. Para gerar o DDL do Hive, use o comandoSHOW CREATE TABLE AS SERDE
. - No Spark 3,0, a coluna do tipo
CHAR
não é permitida em tabelas non-Hive-Serde, e os comandosCREATE/ALTER TABLE
falharão se o tipoCHAR
for detectado. Use o tipoSTRING
. No Spark versão 2.4 e inferiores, o tipoCHAR
é tratado como o tipoSTRING
e o parâmetro de comprimento é simplesmente ignorado.
UDFs e funções internas
- No Spark 3.0, o uso de
org.apache.spark.sql.functions.udf(AnyRef, DataType)
não é permitido por padrão. Definaspark.sql.legacy.allowUntypedScalaUDF
comotrue
para continuar a usá-lo. No Spark versão 2.4 e inferior, seorg.apache.spark.sql.functions.udf(AnyRef, DataType)
obtiver um fechamento Scala com um argumento de tipo primitivo, o UDF retornado retornará nulo se os valores de entrada forem nulos. No entanto, no Spark 3.0, o UDF retornará o valor padrão do tipo Java se o valor de entrada for nulo. Por exemplo,val f = udf((x: Int) => x, IntegerType), f($"x")
retorna NULL no Spark 2.4 e versões inferiores se a coluna x é nula e retorna 0 no Spark 3.0. Essa alteração de comportamento foi introduzida porque o Spark 3.0 foi criado com Scala 2.12 por padrão. - No Spark versão 2.4 e inferiores, você pode criar um mapa com chaves duplicadas por meio de funções internas, por exemplo,
CreateMap
,StringToMap
, etc. O comportamento do mapa com chaves duplicadas é indefinido, por exemplo, a pesquisa de mapa respeita que a chave duplicada aparecerá primeiro,Dataset.collect
mantém apenas a chave duplicada exibida por último,MapKeys
retorna chaves duplicadas, etc. No Spark 3.0, o Spark lançaRuntimeException
quando são encontradas chaves duplicadas. Você pode definirspark.sql.mapKeyDedupPolicy
comoLAST_WIN
para eliminar a duplicação de chaves de mapa com a última política do WINS. Os usuários ainda podem ler valores de mapa com chaves duplicadas de fontes de dados que não a impõem (por exemplo, Parquet); o comportamento é indefinido.
Fontes de dados
- No Spark versão 2.4 e inferiores, o valor da coluna de partição será convertido como null se não puder ser convertido em um esquema fornecido pelo usuário correspondente. No 3.0, o valor da coluna de partição é validado com um esquema fornecido pelo usuário. Uma exceção será gerada se a validação falhar. Você pode desabilitar essa validação definindo
spark.sql.sources.validatePartitionColumns
comofalse
. - No Spark versão 2.4 e inferiores, o analisador da fonte de dados JSON trata cadeias de caracteres vazias como nulas para alguns tipos de dados, como
IntegerType
. ParaFloatType
,DoubleType
,DateType
eTimestampType
, ele falha em cadeias de caracteres vazias e lança exceções. O Spark 3.0 não permite cadeias de caracteres vazias e gerará uma exceção para tipos de dados, exceto paraStringType
eBinaryType
. O comportamento anterior de permitir uma cadeia de caracteres vazia pode ser restaurado com a definição despark.sql.legacy.json.allowEmptyString.enabled
comotrue
. - No Spark 3.0, se os arquivos ou subdiretórios desaparecerem durante a listagem de diretório recursivo (ou seja, eles aparecerem em uma listagem intermediária, mas não puderem ser lidos ou listados durante as fases posteriores da listagem de diretório recursivo devido a exclusões de arquivo simultâneas ou a problemas de consistência de repositório de objetos), a listagem falhará com uma exceção, a menos que
spark.sql.files.ignoreMissingFiles
sejatrue
(o padrão é falso). Em versões anteriores, esses arquivos ou subdiretórios ausentes seriam ignorados. Observe que essa alteração de comportamento só se aplica durante a listagem inicial do arquivo de tabela (ou duranteREFRESH TABLE
), não durante a execução da consulta: a alteração real é quespark.sql.files.ignoreMissingFiles
agora é obedecido durante a listagem de arquivos de tabela e o planejamento de consultas, não apenas no tempo de execução da consulta. - No Spark versão 2.4 e inferiores, a fonte de dados CSV converte uma cadeia de caracteres CSV malformada em uma linha com todos os valores nulos no modo PERMISSIVO. No Spark 3.0, a linha retornada pode conter campos não nulos se alguns valores de coluna CSV foram analisados e convertidos em tipos desejados com êxito.
- No Spark 3.0, o tipo lógico do Parquet
TIMESTAMP_MICROS
é usado por padrão ao salvar colunasTIMESTAMP
. No Spark versão 2.4 e inferiores, as colunasTIMESTAMP
são salvas comoINT96
em arquivos Parquet. Observe que alguns sistemas SQL, como o Hive 1.x e o Impala 2.x, só podem ler carimbos de data/hora INT96. Você pode definirspark.sql.parquet.outputTimestampType
comoINT96
para restaurar o comportamento anterior e manter a interoperabilidade. - No Spark 3.0, quando os arquivos Avro são gravados com o esquema fornecido pelo usuário, os campos fazem correspondência pelos nomes de campo entre o esquema Catalyst e o esquema Avro em vez de posições.
Mecanismo de consulta
- No Spark 3.0, a consulta de conjunto de dados falha se contém referência de coluna ambígua causada por autojunção. Um exemplo típico:
val df1 = ...; val df2 = df1.filter(...);, then df1.join(df2, df1("a") > df2("a"))
retorna um resultado vazio, o que é bastante confuso. Isso ocorre porque o Spark não pode resolver referências de coluna de conjunto de dados que apontam para tabelas que estão sendo unidas automaticamente, edf1("a")
é exatamente o mesmo quedf2("a")
no Spark. Para restaurar o comportamento antes do Spark 3.0, você pode definirspark.sql.analyzer.failAmbiguousSelfJoin
comofalse
. - No Spark 3.0, os números escritos em notação científica (por exemplo,
1E2
) são analisados comoDouble
. No Spark versão 2.4 e inferiores, eles são analisados comoDecimal
. Para restaurar o comportamento antes do Spark 3.0, você pode definirspark.sql.legacy.exponentLiteralAsDecimal.enabled
comotrue
. - No Spark 3.0, a configuração
spark.sql.crossJoin.enabled
se torna uma configuração interna e é verdadeira por padrão. Por padrão, o Spark não lançará exceções no SQL com uniões cruzadas implícitas. - No Spark versão 2.4 e inferior, float/double -0,0 é semanticamente igual a 0,0, mas -0,0 e 0,0 são considerados valores diferentes quando usados em chaves de agrupamento agregado, chaves de partição de janela e chaves de junção. No Spark 3.0, esse bug foi corrigido. Por exemplo,
Seq(-0.0, 0.0).toDF("d").groupBy("d").count()
retorna[(0.0, 2)]
no Spark 3.0 e[(0.0, 1), (-0.0, 1)]
no Spark 2.4 e versões inferiores. - No Spark 3.0, os literais
TIMESTAMP
são convertidos em cadeias de caracteres usando a configuração SQLspark.sql.session.timeZone
. No Spark versão 2.4 e versões inferiores, a conversão usa o fuso horário padrão da máquina virtual Java. - No Spark 3.0, o Spark converte
String
emDate/Timestamp
em comparações binárias com datas/carimbos de data/hora. O comportamento anterior de converterDate/Timestamp
emString
pode ser restaurado pela definição despark.sql.legacy.typeCoercion.datetimeToString.enabled
comotrue
. - No Spark versão 2.4 e inferiores, os IDs de fuso horário inválidos são silenciosamente ignorados e substituídos pelo fuso horário GMT, por exemplo, na função
from_utc_timestamp
. No Spark 3.0, esses IDs de fuso horário são rejeitados e o Spark lançajava.time.DateTimeException
. - No Spark 3.0, o calendário gregoriano proléptico é usado na análise, na formatação e na conversão de datas e carimbos de data/hora, bem como na extração de subcomponentes, como anos, dias e assim por diante. O Spark 3.0 usa classes de API Java 8 de pacotes java.time baseados na cronologia ISO. No Spark versão 2.4 e inferiores, essas operações são executadas usando o calendário híbrido (juliano + gregoriano). As alterações afetam os resultados de datas antes de 15 de outubro de 1582 (gregoriano) e afetam a seguinte API do Spark 3.0:
- Análise/formatação de cadeias de caracteres de data/carimbo de data/hora. Esses efeitos em fontes de dados CSV/JSON e nas funções
unix_timestamp
,date_format
,to_unix_timestamp
,from_unixtime
,to_date
,to_timestamp
quando os padrões especificados por usuários são usados para análise e formatação. No Spark 3.0, definimos nossas próprias cadeias de caracteres de padrão emsql-ref-datetime-pattern.md
, que é implementada por meio dejava.time.format.DateTimeFormatter
nos bastidores. A nova implementação executa uma verificação estrita da sua entrada. Por exemplo, o carimbo de data/hora2015-07-22 10:00:00
não poderá ser analisado se o padrão foryyyy-MM-dd
porque o analisador não consome uma entrada inteira. Outro exemplo é que a entrada de31/01/2015 00:00
não pode ser analisada pelo padrãodd/MM/yyyy hh:mm
porquehh
pressupõe horas no intervalo de 1 a 12. No Spark versão 2.4 e inferiores,java.text.SimpleDateFormat
é usado para conversões de cadeia de caracteres de data/carimbo de data/hora, e os padrões com suporte são descritos em simpleDateFormat. O comportamento antigo pode ser restaurado pela definição despark.sql.legacy.timeParserPolicy
comoLEGACY
. - As funções
weekofyear
,weekday
,dayofweek
,date_trunc
,from_utc_timestamp
,to_utc_timestamp
eunix_timestamp
usam a APIjava.time
para calcular o número da semana do ano, o número do dia da semana, bem como para a conversão entre valoresTimestampType
no fuso horário UTC. - As opções JDBC
lowerBound
eupperBound
são convertidas em valores TimestampType/DataType da mesma maneira que a conversão de cadeias de caracteres em valores TimestampType/DataType. A conversão é baseada no calendário gregoriano proléptico e no fuso horário definido pela configuração SQLspark.sql.session.timeZone
. No Spark versão 2.4 e inferior, a conversão é baseada no calendário híbrido (juliano + gregoriano) e no fuso horário padrão do sistema. - Formatação de literais
TIMESTAMP
eDATE
. - Criação de literais
TIMESTAMP
eDATE
tipados de cadeias de caracteres. No Spark 3.0, a conversão de cadeia de caracteres em literaisTIMESTAMP/DATE
tipados é executada por meio da conversão em valoresTIMESTAMP/DATE
. Por exemplo,TIMESTAMP '2019-12-23 12:59:30'
é semanticamente igual aCAST('2019-12-23 12:59:30' AS TIMESTAMP)
. Quando a cadeia de caracteres de entrada não contém informações sobre o fuso horário, o fuso horário da configuração SQLspark.sql.session.timeZone
é usado nesse caso. No Spark versão 2.4 e inferiores, a conversão é baseada no fuso horário do sistema JVM. As diferentes fontes do fuso horário padrão podem alterar o comportamento dos literaisTIMESTAMP
eDATE
tipados.
- Análise/formatação de cadeias de caracteres de data/carimbo de data/hora. Esses efeitos em fontes de dados CSV/JSON e nas funções
Apache Hive
- No Spark 3.0, atualizamos a versão interna do Hive de 1.2 para 2.3, o que traz os seguintes impactos:
- Talvez seja necessário definir
spark.sql.hive.metastore.version
espark.sql.hive.metastore.jars
de acordo com a versão do metastore do Hive ao qual você deseja se conectar. Por exemplo: definaspark.sql.hive.metastore.version
como1.2.1
espark.sql.hive.metastore.jars
comomaven
se sua versão de metastore do Hive for 1.2.1. - Você precisa migrar seu SerDes personalizado para o Hive 2.3 ou criar seu próprio Spark com o perfil
hive-1.2
. Confira o HIVE-15167 para obter mais detalhes. - A representação da cadeia de caracteres pode ser diferente entre Hive 1.2 e Hive 2.3 ao usar o operador
TRANSFORM
no SQL para transformação de script, que depende do comportamento do Hive. No Hive 1.2, a representação da cadeia de caracteres omite zeros à direita. Mas no Hive 2.3, ele sempre é preenchido até 18 dígitos com zeros à direita, se necessário. - No Databricks Runtime 7.x, ao ler uma tabela SerDe do Hive, por padrão, o Spark não permite a leitura de arquivos em um subdiretório que não seja uma partição de tabela. Para habilitá-lo, defina a configuração
spark.databricks.io.hive.scanNonpartitionedDirectory.enabled
comotrue
. Isso não afeta os leitores da tabela nativa do Spark e os leitores de arquivo.
- Talvez seja necessário definir
MLlib
OneHotEncoder
, que é preterido na versão 2.3, foi removido no 3.0 eOneHotEncoderEstimator
agora é renomeado comoOneHotEncoder
.org.apache.spark.ml.image.ImageSchema.readImages
, que foi preterido na versão 2.3, foi removido na versão 3.0. Usespark.read.format('image')
em vez disso.org.apache.spark.mllib.clustering.KMeans.train
com o parâmetro Intruns
, que foi preterido na versão 2.1, foi removido na versão 3.0. Use o método train sem execuções.org.apache.spark.mllib.classification.LogisticRegressionWithSGD
, que foi preterido na versão 2.0, foi removido na 3.0, useorg.apache.spark.ml.classification.LogisticRegression
ouspark.mllib.classification.LogisticRegressionWithLBFGS
.org.apache.spark.mllib.feature.ChiSqSelectorModel.isSorted
, que foi preterida na versão 2.1, foi removida na versão 3.0 e não se destina a uso de subclasses.org.apache.spark.mllib.regression.RidgeRegressionWithSGD
, que foi preterido na versão 2.0, foi removido na versão 3.0. Useorg.apache.spark.ml.regression.LinearRegression
comelasticNetParam = 0.0
. Observe que oregParam
padrão é 0,01 paraRidgeRegressionWithSGD
, mas é 0,0 paraLinearRegression
.org.apache.spark.mllib.regression.LassoWithSGD
, que foi preterido na versão 2.0, foi removido na versão 3.0. Useorg.apache.spark.ml.regression.LinearRegression
comelasticNetParam = 1.0
. Observe que oregParam
padrão é 0,01 paraLassoWithSGD
, mas é 0,0 paraLinearRegression
.org.apache.spark.mllib.regression.LinearRegressionWithSGD
, que foi preterido na versão 2.0, foi removido na versão 3.0. Em vez disso, useorg.apache.spark.ml.regression.LinearRegression
ouLBFGS
.org.apache.spark.mllib.clustering.KMeans.getRuns
esetRuns
, que foram preteridos na versão 2.1, foram removidos na versão 3.0 e não produzem efeitos desde o Spark 2.0.0.org.apache.spark.ml.LinearSVCModel.setWeightCol
, que foi preterido na versão 2.4, foi removido na versão 3.0 e não se destina a usuários.- Na versão 3.0,
org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel
estendeMultilayerPerceptronParams
para expor os parâmetros de treinamento. Como resultado,layers
noMultilayerPerceptronClassificationModel
foi alterado deArray[Int]
paraIntArrayParam
. Você deve usarMultilayerPerceptronClassificationModel.getLayers
em vez deMultilayerPerceptronClassificationModel.layers
para recuperar o tamanho das camadas. org.apache.spark.ml.classification.GBTClassifier.numTrees
, que foi preterido na versão 2.4.5, foi removido na versão 3.0. UsegetNumTrees
em vez disso.org.apache.spark.ml.clustering.KMeansModel.computeCost
, que foi preterido na versão 2.4, foi removido na 3.0; useClusteringEvaluator
.- A precisão da variável de membro em
org.apache.spark.mllib.evaluation.MulticlassMetrics
, que foi preterida na versão 2.0, foi removida na versão 3.0. Use a precisão. - O recall da variável de membro em
org.apache.spark.mllib.evaluation.MulticlassMetrics
, que foi preterida na versão 2.0, foi removida na versão 3.0. Useaccuracy
em vez disso. - A variável de membro
fMeasure
emorg.apache.spark.mllib.evaluation.MulticlassMetrics
, que foi preterida na versão 2.0, foi removida na versão 3.0. Useaccuracy
em vez disso. org.apache.spark.ml.util.GeneralMLWriter.context
, que foi preterido na versão 2.0, foi removido na versão 3.0. Usesession
em vez disso.org.apache.spark.ml.util.MLWriter.context
, que foi preterido na versão 2.0, foi removido na versão 3.0. Usesession
em vez disso.org.apache.spark.ml.util.MLReader.context
, que foi preterido na versão 2.0, foi removido na versão 3.0. Usesession
em vez disso.abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]]
foi alterado paraabstract class UnaryTransformer[IN: TypeTag, OUT: TypeTag, T <: UnaryTransformer[IN, OUT, T]]
na versão 3.0.- No Spark 3.0, uma regressão logística de multiclasse no Pyspark agora retornará (corretamente)
LogisticRegressionSummary
, não a subclasseBinaryLogisticRegressionSummary
. Os métodos adicionais expostos peloBinaryLogisticRegressionSummary
não funcionariam nesse caso, de qualquer forma. (SPARK-31681) - No Spark 3.0,
pyspark.ml.param.shared.Has*
os mixins não fornecem mais nenhum método setterset*(self, value)
; use o respectivoself.set(self.*, value)
. Confira o SPARK-29093 para obter detalhes. (SPARK-29093)
Outras alterações de comportamento
A atualização para o Scala 2.12 envolve as seguintes alterações:
A serialização de célula do pacote é tratada de forma diferente. O exemplo a seguir ilustra a alteração de comportamento e como tratá-la.
A execução de
foo.bar.MyObjectInPackageCell.run()
conforme definido na célula do pacote a seguir disparará o errojava.lang.NoClassDefFoundError: Could not initialize class foo.bar.MyObjectInPackageCell$
package foo.bar case class MyIntStruct(int: Int) import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions._ import org.apache.spark.sql.Column object MyObjectInPackageCell extends Serializable { // Because SparkSession cannot be created in Spark executors, // the following line triggers the error // Could not initialize class foo.bar.MyObjectInPackageCell$ val spark = SparkSession.builder.getOrCreate() def foo: Int => Option[MyIntStruct] = (x: Int) => Some(MyIntStruct(100)) val theUDF = udf(foo) val df = { val myUDFInstance = theUDF(col("id")) spark.range(0, 1, 1, 1).withColumn("u", myUDFInstance) } def run(): Unit = { df.collect().foreach(println) } }
Para contornar esse erro, você pode encapsular
MyObjectInPackageCell
dentro de uma classe serializável.Determinados casos que usam
DataStreamWriter.foreachBatch
exigirão uma atualização do código-fonte. Essa alteração ocorre devido ao fato de que o Scala 2.12 tem conversão automática de expressões lambda em tipos SAM e pode causar ambiguidade.Por exemplo, o seguinte código Scala não pode ser compilado:
streams .writeStream .foreachBatch { (df, id) => myFunc(df, id) }
Para corrigir o erro de compilação, altere
foreachBatch { (df, id) => myFunc(df, id) }
paraforeachBatch(myFunc _)
ou use a API Java explicitamente:foreachBatch(new VoidFunction2 ...)
.
Como a versão do Apache Hive usada para lidar com funções definidas pelo usuário do Hive e SerDes do Hive é atualizada para 2.3, duas alterações são necessárias:
- A interface
SerDe
do Hive é substituída por uma classe abstrataAbstractSerDe
. Para qualquer implementaçãoSerDe
personalizada do Hive, a migração paraAbstractSerDe
é obrigatória. - A definição de
spark.sql.hive.metastore.jars
comobuiltin
significa que o cliente de metastore do Hive 2.3 será usado para acessar metastores para o Databricks Runtime 7.x. Se você precisar acessar metastores externos baseados no Hive 1.2, definaspark.sql.hive.metastore.jars
como a pasta que contém jars do Hive 1.2.
- A interface
Desativações e remoções
- O índice que ignora dados foi preterido no Databricks Runtime 4.3 e removido no Databricks Runtime 7.x. Recomendamos usar tabelas Delta no lugar, pois oferecem recursos aprimorados de omissão de dados.
- No Databricks Runtime 7, a versão subjacente do Apache Spark usa o Scala 2.12. Como as bibliotecas compiladas no Scala 2.11 podem desabilitar os clusters do Databricks Runtime 7.x de maneiras inesperadas, os clusters que executam o Databricks Runtime 7.x não instalam bibliotecas configuradas para serem instaladas em todos os clusters. A guia Bibliotecas do cluster mostra um status
Skipped
e uma mensagem de obsolescência que explica as alterações no tratamento da biblioteca. No entanto, se você tiver um cluster criado em uma versão anterior do Databricks Runtime antes da versão da plataforma do Azure Databricks 3.20 ser lançada em seu espaço de trabalho, e agora editar esse cluster para usar o Databricks Runtime 7.x, todas as bibliotecas que foram configuradas para serem instaladas em todos os clusters serão instaladas naquele cluster. Nesse caso, quaisquer JARs incompatíveis nas bibliotecas instaladas podem fazer com que o cluster seja desabilitado. A solução alternativa é clonar o cluster ou criar um novo cluster.
Problemas conhecidos
- A análise do dia do ano com o uso da letra do padrão “D” retorna o resultado errado quando o campo “ano” está ausente. Isso pode acontecer em funções SQL, como
to_timestamp
, que analisa a cadeia de caracteres datetime como valores datetime usando uma cadeia de caracteres de padrão. (SPARK-31939) - Junção/janela/agregação dentro de subconsultas pode levar a resultados incorretos se as chaves tiverem valores -0,0 e 0,0. (SPARK-31958)
- Uma consulta de janela pode falhar com um erro de autojunção ambíguo inesperadamente. (SPARK-31956)
- As consultas de streaming com operador
dropDuplicates
podem não conseguir reiniciar com o ponto de verificação gravado pelo Spark 2.x. (SPARK-31990)