Databricks Runtime 7.x migrálási útmutató
Ez az útmutató útmutatást nyújt az Azure Databricks számítási feladatainak Az Apache Spark 2.4-es verziójára épülő Databricks Runtime 6.x-ről a Databricks Runtime 7.3 LTS-be vagy a Databricks Runtime 7.6-ra (nem támogatott) való migrálásához (a Databricks Runtime 7.x legújabb kiadása), mindkettő a Spark 3.0-ra épül. Ugyanezek a migrálási szempontok vonatkoznak a Databricks Runtime 7.3 LTS Machine Learning, a Databricks Runtime 7.3 LTS for Genomics és a Databricks Runtime 7.6 Machine Learning esetében.
Ez az útmutató felsorolja azokat a Spark 3.0-viselkedésváltozásokat , amelyek az Azure Databricks számítási feladatainak frissítését igényelhetik. Ilyen változások közé tartozik a Python 2 támogatásának teljes eltávolítása, a Scala 2.12-re való frissítés, a JDK 11 teljes támogatása, valamint a Gergely-naptárról a proleptikus naptárra váltás dátumok és időbélyegek esetében.
Ez az útmutató a Databricks Runtime 7.3 LTS migrálási útmutatójának kísérője.
A Databricks Runtime 7.x-en elérhető új funkciók és fejlesztések
A Databricks Runtime 7.3 LTS-ben és a Databricks Runtime 7.6-ban található új funkciók, fejlesztések és kódtárfrissítések listáját az áttelepítés alatt álló verziónál magasabb Databricks Runtime-verziók kibocsátási megjegyzéseiben találja. A Databricks Runtime 7.x esetében ezek a következők:
- Databricks Runtime 7.0 (nem támogatott)
- Databricks Runtime 7.0 ML (nem támogatott)
- Databricks Runtime 7.1 (nem támogatott)
- Databricks Runtime 7.1 for Machine Learning (Nem támogatott)
- Databricks Runtime 7.2 (nem támogatott)
- Databricks Runtime 7.2 for Machine Learning (Nem támogatott)
- Databricks Runtime 7.3 LTS
- Databricks Runtime 7.3 LTS Machine Learning
- Databricks Runtime 7.4 (nem támogatott)
- Databricks Runtime 7.4 for Machine Learning (Nem támogatott)
- Databricks Runtime 7.5 (nem támogatott)
- Databricks Runtime 7.5 for Machine Learning (Nem támogatott)
- Databricks Runtime 7.6 (nem támogatott)
- Databricks Runtime 7.6 for Machine Learning (Nem támogatott)
A kiadás utáni karbantartási frissítések a Databricks futásidejű karbantartási frissítéseiben találhatók.
Databricks Runtime 7.3 LTS és 7.6 rendszerkörnyezet
- Operációs rendszer: Ubuntu 18.04.5 LTS
- Java:
- 7.6: Zulu 8.50.0.51-CA-linux64 (build: 1.8.0_275-b01)
- 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-tó 0.7.0
Az Apache Spark 3.0 fő viselkedésváltozásai
A Spark 2.4-ről a Spark 3.0-ra történő alábbi viselkedésváltozások szükségessé teheti az Azure Databricks számítási feladatainak frissítését, amikor a Databricks Runtime 6.x-ről a Databricks Runtime 7.x-be migrál.
Megjegyzés
Ez a cikk felsorolja a Spark viselkedésének fontos változásait, amelyeket figyelembe kell vennie a Databricks Runtime 7.x-be való migrálás során. A viselkedésváltozások teljes listáját a Spark 3.0.1 migrálási útmutatójában találja.
Mag
- A Spark 3.0-ban a rendszer eltávolítja az elavult akkumulátor v1-et.
- Az eseménynapló-fájl UTF-8 kódolásként lesz megírva, a Spark History Server pedig UTF-8 kódolásként fogja visszajátszani az eseménynapló-fájlokat. Korábban a Spark az illesztőprogram JVM-folyamatának alapértelmezett karakterkészleteként írta az eseménynapló-fájlt, ezért a Spark 2.x Spark Előzménykiszolgálója nem kompatibilis kódolás esetén a régi eseménynapló-fájlok olvasásához szükséges.
- A rendszer új protokollt használ az elosztási blokkok beolvasásához. A Spark 3.0-alkalmazások futtatásakor javasoljuk a külső shuffle-szolgáltatások frissítését. A régi külső shuffle-szolgáltatásokat továbbra is használhatja a konfiguráció beállításával
spark.shuffle.useOldFetchProtocol
true
. Ellenkező esetben a Spark az olyan üzenetekkel kapcsolatos hibákba ütközhet, mint aIllegalArgumentException: Unexpected message type: <number>
.
PySpark
- A Spark 3.0-ban úgy van kijavítva,
Column.getItem
hogy nem hívható megColumn.apply
. Következésképpen, haColumn
argumentumkéntgetItem
használják, akkor az indexelő operátort kell használni. Példáulmap_col.getItem(col('id'))
a következőre kell cserélnimap_col[col('id')]
: . - A Spark 3.0-hoz hasonlóan a
Row
mezőnevek nem lesznek betűrendben rendezve a Python 3.6-os és újabb verzióiban elnevezett argumentumokkal való összeállításkor, és a mezők sorrendje megegyezik a megadott sorrenddel. Ha alapértelmezés szerint engedélyezni szeretné a rendezett mezőket, a Spark 2.4-hez hasonlóan állítsa a környezeti változótPYSPARK_ROW_FIELD_SORTING_ENABLED
true
a végrehajtók és az illesztőprogramok számára is. Ennek a környezeti változónak konzisztensnek kell lennie az összes végrehajtón és illesztőprogramon. Ellenkező esetben hibákhoz vagy helytelen válaszokhoz vezethet. A 3.6-nál alacsonyabb Python-verziók esetén a mezőnevek betűrendben vannak rendezve egyetlen lehetőségként. - Elavult Python 2-támogatás (SPARK-27884).
Strukturált streamelés
- A Spark 3.0-ban a Structured Streaming nullable-ra kényszeríti a forrássémát, ha fájlalapú adatforrásokat (például szöveg, json, csv, parquet és orc) használnak.
spark.readStream(...)
Korábban tiszteletben tartotta a forrásséma nullbilitását; az NPE hibakeresése azonban bonyolult problémákat okozott. Az előző viselkedés visszaállításához állítsa be a következőtspark.sql.streaming.fileSource.schema.forceNullable
false
: . - A Spark 3.0 kijavítja a Stream-stream külső illesztés helyességi problémáját, amely megváltoztatja az állapotsémát. További részletekért lásd a SPARK-26154-et . Ha a lekérdezést a Spark 2.x-ből létrehozott ellenőrzőpontról indítja el, amely stream-stream külső illesztést használ, a Spark 3.0 sikertelen lesz. A kimenetek újraszámításához elveti az ellenőrzőpontot, és visszajátssza a korábbi bemeneteket.
- A Spark 3.0-ban az elavult osztály
org.apache.spark.sql.streaming.ProcessingTime
el lett távolítva. Aorg.apache.spark.sql.streaming.Trigger.ProcessingTime
használható helyette. Hasonlóképpen,org.apache.spark.sql.execution.streaming.continuous.ContinuousTrigger
eltávolították javáraTrigger.Continuous
, ésorg.apache.spark.sql.execution.streaming.OneTimeTrigger
el lett rejtve javáraTrigger.Once
. Lásd: SPARK-28199.
SQL, adatkészletek és DataFrame
- A Spark 3.0-ban, amikor egy értéket egy másik adattípusú táblázatoszlopba szúr be, a típus kényszerítése az ANSI SQL szabvány szerint történik. Bizonyos ésszerűtlen típuskonverziók, például a konvertálás
string
int
double
és a konvertálásboolean
nem engedélyezettek. Futásidejű kivétel jelenik meg, ha az érték kívül esik az oszlop adattípusának tartományán. A Spark 2.4-es és korábbi verzióiban a táblázat beszúrása során a típuskonverziók engedélyezettek mindaddig, amíg érvényesekCast
. Ha tartományon kívüli értéket szúr be egy egész mezőbe, az érték alacsonyrendű bitjei lesznek beszúrva (ugyanaz, mint a Java/Scala numerikus típusú öntés). Ha például 257 van beszúrva egy bájt típusú mezőbe, az eredmény 1. A viselkedést a beállításspark.sql.storeAssignmentPolicy
vezérli, amelynek alapértelmezett értéke "ANSI". Az "Örökölt" beállítás beállítása visszaállítja az előző viselkedést. - A Spark 3.0-ban, amikor a sztringértéket egész típusokra (tinyint, smallint, int és bigint), dátum/idő típusúra (dátum, időbélyeg és intervallum) és logikai típusra alakítja, a rendszer levágja a kezdő és záró szóközöket (<= ACSII 32), mielőtt ezekre a típusértékekre konvertálná őket, például
cast(' 1\t' as int)
visszaadja1
,cast(' 1\t' as boolean)
visszaadjatrue
,cast('2019-10-10\t as date)
visszaadja a dátumértéket2019-10-10
. A Spark 2.4-es és korábbi verzióiban, miközben a sztringet integrálokra és logikai értékekre öntötte, nem vágja le a térközöket mindkét végből, a fenti eredményeknull
a dátum/idő értékekig csak a záró szóközöket (= ASCII 32) távolítják el. Lásd: https://databricks.com/blog/2020/07/22/a-comprehensive-look-at-dates-and-timestamps-in-apache-spark-3-0.html. - A Spark 3.0-ban az elavult metódusok
SQLContext.createExternalTable
elSparkSession.createExternalTable
lettek távolítva a csere mellett,createTable
. - A Spark 3.0-ban a konfiguráció
spark.sql.crossJoin.enabled
belső konfigurációvá válik, és alapértelmezés szerint igaz, így alapértelmezés szerint a Spark nem emel kivételt SQL implicit keresztillesztésekkel. - A Spark 3.0-ban megfordítottuk a trim függvény
TRIM(trimStr, str)
argumentumsorrendét, hogyTRIM(str, trimStr)
kompatibilisek legyenek más adatbázisokkal. - A Spark 2.4-es és korábbi verzióiban SQL lekérdezéseket, például
FROM <table>
véletlenül támogatják vagyFROM <table> UNION ALL FROM <table>
támogatják. Hive-stílusbanFROM <table> SELECT <expr>
aSELECT
záradék nem elhanyagolható. Sem a Hive, sem a Presto nem támogatja ezt a szintaxist. Ezért ezeket a lekérdezéseket érvénytelennek fogjuk tekinteni a Spark 3.0 óta. - A Spark 3.0 óta az Adathalmaz és a DataFrame API
unionAll
már nem elavult. Ez egy alias aunion
. - A Spark 2.4-es és korábbi verzióiban a JSON-adatforrás elemzője null értékként kezeli az üres sztringeket bizonyos adattípusok esetében, például
IntegerType
. AzFloatType
ésDoubleType
, az üres sztringek esetében meghiúsul, és kivételeket ad ki. A Spark 3.0 óta nem engedélyezzük az üres sztringeket, és kivételeket adunk ki az adattípusokra,StringType
kivéve ésBinaryType
. - A Spark 3.0 óta a
from_json
függvények két módot támogatnak –PERMISSIVE
ésFAILFAST
. A módok a beállítással állíthatókmode
be. Az alapértelmezett mód lettPERMISSIVE
. A korábbi verziókban afrom_json
viselkedés nem felelt meg sem a helytelen formátumú JSON-rekordok feldolgozásának, semPERMISSIVE
FAILFAST,
pedig különösen a feldolgozásuknak. A sémáta INT
tartalmazó JSON-sztringet{"a" 1}
például a korábbi verziók konvertáljáknull
, de a Spark 3.0 átalakítja .Row(null)
DDL-utasítások
- A Spark 3.0-ban
CREATE TABLE
egy adott szolgáltató nélkül a szolgáltató értékétspark.sql.sources.default
használja. A Spark 2.4-es és újabb verzióiban a Hive volt. A Spark 3.0 előtti működés visszaállításához állítsa bespark.sql.legacy.createHiveTableByDefault.enabled
a következőttrue
: . - A Spark 3.0-ban, amikor egy értéket egy másik adattípusú táblázatoszlopba szúr be, a típus kényszerítése az ANSI SQL szabványnak megfelelően történik. Bizonyos ésszerűtlen típuskonverziók, például a konvertálás
string
int
double
és aboolean
konvertálás nem engedélyezettek. Futásidejű kivétel jelenik meg, ha az érték kívül esik az oszlop adattípusának tartományán. A Spark 2.4-es és újabb verzióiban a táblázat beszúrása során a típuskonverziók mindaddig engedélyezettek, amíg érvényesekCast
. Ha tartományon kívüli értéket szúr be egy egész mezőbe, az érték alacsonyrendű bitjei lesznek beszúrva (ugyanaz, mint a Java/Scala numerikus típusú öntés). Ha például egy bájt típusú mezőbe 257 van beszúrva, az eredmény 1. A viselkedést a beállításspark.sql.storeAssignmentPolicy
vezérli, amelynek alapértelmezett értéke "ANSI". Ha a beállítást "Örökölt" értékre állítja, az visszaállítja az előző viselkedést. - A Spark 3.0-ban
SHOW CREATE TABLE
mindig Spark DDL-t ad vissza, még akkor is, ha az adott tábla Hive SerDe tábla. Hive DDL létrehozásához használjaSHOW CREATE TABLE AS SERDE
a parancsot. - A Spark 3.0-ban a típusoszlop
CHAR
nem engedélyezett a nem Hive-Serde táblákban, ésCREATE/ALTER TABLE
a parancsok meghiúsulnak, haCHAR
típust észlel.STRING
Használja inkább a típust. A Spark 2.4-es és újabb verzióiban a rendszer típusként kezeli a típustSTRING
,CHAR
és a hosszparamétert egyszerűen figyelmen kívül hagyja.
UDF-ek és beépített függvények
- A Spark 3.0-ban a használat
org.apache.spark.sql.functions.udf(AnyRef, DataType)
alapértelmezés szerint nem engedélyezett. Állítsa bespark.sql.legacy.allowUntypedScalaUDF
, hogytrue
továbbra is használja. Ha a Spark 2.4-es és újabborg.apache.spark.sql.functions.udf(AnyRef, DataType)
verzióiban Scala-lezárást kap primitív típusú argumentummal, a visszaadott UDF null értéket ad vissza, ha a bemeneti értékek null értékűek. A Spark 3.0-ban azonban az UDF a Java-típus alapértelmezett értékét adja vissza, ha a bemeneti érték null. Például null értéket ad vissza a Spark 2.4-ben és alatta,val f = udf((x: Int) => x, IntegerType), f($"x")
ha az x oszlop null, és 0-t ad vissza a Spark 3.0-ban. Ez a viselkedésváltozás azért jelenik meg, mert a Spark 3.0 alapértelmezés szerint a Scala 2.12-vel készült. - A Spark 2.4-es és újabb verzióiban olyan beépített függvényekkel hozhat létre térképet, amely duplikált kulcsokkal rendelkezik, például
CreateMap
: ,StringToMap
stb. A duplikált kulcsokkal való leképezés működése nincs meghatározva, például a leképezési keresés figyelembe vételével a duplikált kulcs jelenik meg először,Dataset.collect
csak a duplikált kulcs jelenik meg utoljára,MapKeys
duplikált kulcsokat ad vissza stb. A Spark 3.0-ban a Spark eldobjaRuntimeException
a duplikált kulcsokat. Beállíthatjaspark.sql.mapKeyDedupPolicy
, hogy aLAST_WIN
legutóbbi wins szabályzattal deduplikálja a térképkulcsokat. A felhasználók továbbra is olvashatják az ismétlődő kulcsokkal rendelkező leképezési értékeket olyan adatforrásokból, amelyek nem kényszerítik ki őket (például Parquet), a viselkedés nincs meghatározva.
Adatforrások
- A Spark 2.4-es és újabb verzióiban a partícióoszlop értéke null értékké lesz konvertálva, ha nem alakítható át a megfelelő felhasználó által megadott sémába. A 3.0-ban a partícióoszlop értékét egy felhasználó által megadott sémával érvényesíti a rendszer. Kivételhiba lép fel, ha az érvényesítés sikertelen. Az ilyen érvényesítést letilthatja a következő beállítással
spark.sql.sources.validatePartitionColumns
false
: . - A Spark 2.4-es és újabb verzióiban a JSON-adatforrás elemzője null értékként kezeli az üres sztringeket bizonyos adattípusok, például
IntegerType
a . AFloatType
,DoubleType
DateType
ésTimestampType
az üres sztringek esetében meghiúsul, és kivételeket ad ki. A Spark 3.0 nem engedélyezi az üres sztringeket, és kivételt jelez az adattípusok esetében,StringType
kivéve az ésBinaryType
a . Az üres sztringek engedélyezésének korábbi viselkedése a következő beállítássalspark.sql.legacy.json.allowEmptyString.enabled
true
állítható vissza: . - A Spark 3.0-ban, ha a fájlok vagy alkönyvtárak eltűnnek a rekurzív könyvtárlista alatt (vagyis egy köztes listaelemben jelennek meg, de a rekurzív könyvtárlista későbbi fázisaiban nem olvashatók vagy nem listázhatók, az egyidejű fájltörlések vagy az objektumtároló konzisztenciaproblémái miatt), akkor a listaelem kivétellel meghiúsul, kivéve, ha
spark.sql.files.ignoreMissingFiles
ez aztrue
alapértelmezett hamis érték. A korábbi verziókban a rendszer figyelmen kívül hagyja ezeket a hiányzó fájlokat vagy alkönyvtárakat. Vegye figyelembe, hogy ez a viselkedésbeli változás csak a táblafájl kezdeti listázásakor (vagy közbenREFRESH TABLE
) érvényes, a lekérdezés végrehajtása során nem: a nettó változás az, amitspark.sql.files.ignoreMissingFiles
a táblafájllista és a lekérdezéstervezés során végre kell tartani, nem csak a lekérdezések végrehajtási idején. - A Spark 2.4-es és újabb verzióiban a CSV-adatforrás egy helytelen formátumú CSV-sztringet konvertál egy sorba, amelyben minden null érték PERMISSIVE módban van. A Spark 3.0-ban a visszaadott sor nem null értékű mezőket tartalmazhat, ha a CSV-oszlopértékek egy része sikeresen át lett alakítva a kívánt típusra.
- A Spark 3.0-ban alapértelmezés szerint parquet logikai típust
TIMESTAMP_MICROS
használ az oszlopok mentésekorTIMESTAMP
. A Spark 2.4-es és újabbTIMESTAMP
verzióiban az oszlopok parquet-fájlokkéntINT96
vannak mentve. Vegye figyelembe, hogy egyes SQL rendszerek, például a Hive 1.x és az Impala 2.x csak INT96 időbélyegeket képesek olvasni. Beállíthatjaspark.sql.parquet.outputTimestampType
,INT96
hogy visszaállítsa az előző viselkedést, és fenntartsa az együttműködési képességet. - A Spark 3.0-ban, amikor az Avro-fájlokat a felhasználó által megadott sémával írják, a mezőket a katalizátorséma és az Avro séma közötti mezőnevek egyeztetik a pozíciók helyett.
Lekérdezési motor
- A Spark 3.0-ban az adathalmaz-lekérdezés meghiúsul, ha nem egyértelmű oszlophivatkozást tartalmaz, amelyet az önillesztés okoz. Egy tipikus példa:
val df1 = ...; val df2 = df1.filter(...);, then df1.join(df2, df1("a") > df2("a"))
üres eredményt ad vissza, amely meglehetősen zavaró. Ennek az az oka, hogy a Spark nem tudja feloldani az olyan adathalmaz-oszlophivatkozásokat, amelyek az önállóan összekapcsolt táblákra mutatnak, ésdf1("a")
pontosan megegyeznekdf2("a")
a Sparkban lévőkkel. A Spark 3.0 előtti működés visszaállításához állítsa bespark.sql.analyzer.failAmbiguousSelfJoin
a következőtfalse
: . - A Spark 3.0-ban a tudományos jelöléssel írt számok (például
1E2
) a következőképpen vannak elemezveDouble
: . A Spark 2.4-es és újabb verzióiban a rendszer a következőképpen elemziDecimal
őket: . A Spark 3.0 előtti működés visszaállításához állítsa bespark.sql.legacy.exponentLiteralAsDecimal.enabled
a következőttrue
: . - A Spark 3.0-ban a konfiguráció
spark.sql.crossJoin.enabled
belső konfigurációvá válik, és alapértelmezés szerint igaz. Alapértelmezés szerint a Spark nem emel kivételeket az implicit keresztillesztésekkel rendelkező SQL. - A Spark 2.4-es és újabb verzióiban a float/double -0.0 szemantikailag egyenlő 0.0-sal, de a -0.0 és a 0.0 eltérő értéknek számít, ha összesítő csoportosítási kulcsokban, ablakpartíciós kulcsokban és illesztési kulcsokban használják. A Spark 3.0-ban ez a hiba ki van javítva. Például
Seq(-0.0, 0.0).toDF("d").groupBy("d").count()
a Spark 3.0-ban, valamint[(0.0, 1), (-0.0, 1)]
a Spark 2.4-ben és az alatta lévőket adja vissza[(0.0, 2)]
. - A Spark 3.0-ban
TIMESTAMP
a literálok sztringekké lesznek konvertálva a SQL konfigurációspark.sql.session.timeZone
használatával. A Spark 2.4-es és újabb verzióiban a konvertálás a Java virtuális gép alapértelmezett időzónáját használja. - A Spark 3.0-ban a Spark
String
Date/Timestamp
bináris összehasonlítást alkalmaz a dátumokkal/időbélyegekkel. Az öntésDate/Timestamp
String
korábbi viselkedése a következő beállítássalspark.sql.legacy.typeCoercion.datetimeToString.enabled
állítható vissza:true
. - A Spark 2.4-es és újabb verzióiban az érvénytelen időzóna-azonosítókat a rendszer csendesen figyelmen kívül hagyja, és lecseréli a GMT-időzóna, például a
from_utc_timestamp
függvényben. A Spark 3.0-ban az ilyen időzóna-azonosítók el lesznek utasítva, és a Spark dob.java.time.DateTimeException
- A Spark 3.0-ban a Proleptic Gergely-naptár a dátumok és időbélyegek elemzéséhez, formázásához és konvertálásához, valamint alösszetevők, például évek, napok stb. kinyerésére használható. A Spark 3.0 Java 8 API-osztályokat használ az ISO-kronológián alapuló java.time csomagokból. A Spark 2.4-es és újabb verzióiban ezek a műveletek a hibrid naptár (Julian + Gergely-naptár) használatával hajthatók végre. A módosítások hatással vannak az 1582. október 15. előtti dátumok eredményeire (Gergely-naptár), és a következő Spark 3.0 API-t érintik:
- Időbélyeg-/dátumsztringek elemzése/formázása. Ez hatással van a CSV-/JSON-adatforrásokra és a
unix_timestamp
,date_format
,to_unix_timestamp
,from_unixtime
, ,to_date
függvényekre,to_timestamp
ha a felhasználók által meghatározott mintákat használnak elemzéshez és formázáshoz. A Spark 3.0-bansql-ref-datetime-pattern.md
saját mintasztringeket definiálunk, amelyek implementálásajava.time.format.DateTimeFormatter
a motorháztető alatt történik. Az új implementáció szigorú ellenőrzést végez a bemeneten. Az időbélyeg például nem elemezhető,2015-07-22 10:00:00
ha a minta azért vanyyyy-MM-dd
, mert az elemző nem használ fel teljes bemenetet. Egy másik példa arra, hogy a31/01/2015 00:00
bemenetet nem tudja elemezni add/MM/yyyy hh:mm
minta, merthh
az 1–12 tartományban órákat feltételez. A Spark 2.4-es és újabbjava.text.SimpleDateFormat
verzióiban időbélyeg-/dátumsztring-konverziókhoz használható, a támogatott mintákat pedig a simpleDateFormat ismerteti. The old behavior can be restored by settingspark.sql.legacy.timeParserPolicy
toLEGACY
. - A
weekofyear
,weekday
,dayofweek
,date_trunc
,from_utc_timestamp
,to_utc_timestamp
ésunix_timestamp
függvények API-t használnakjava.time
az év hétszámának, a hét napszámának kiszámításához, valamint az UTC időzónában lévő értékekről/értékekre való konvertáláshozTimestampType
. - A JDBC beállításai
lowerBound
, ésupperBound
a timestampType/DateType értékekké konvertálása ugyanúgy történik, mint a sztringek TimestampType/DateType értékekké alakítása. Az átalakítás a Proleptic Gergely-naptáron és a SQL konfigurációspark.sql.session.timeZone
által meghatározott időzónán alapul. A Spark 2.4-es és újabb verzióiban a konverzió a hibrid naptáron (Julian + Gergely-naptár) és az alapértelmezett rendszeridőzónán alapul. - Formázás
TIMESTAMP
ésDATE
literálok. - Gépelt
TIMESTAMP
ésDATE
literálok létrehozása sztringekből. A Spark 3.0-ban a sztringek típusosTIMESTAMP/DATE
literálokké konvertálása értékekre történőTIMESTAMP/DATE
öntéssel történik. PéldáulTIMESTAMP '2019-12-23 12:59:30'
szemantikailag egyenlő.CAST('2019-12-23 12:59:30' AS TIMESTAMP)
Ha a bemeneti sztring nem tartalmaz információt az időzónáról, akkor ebben az esetben a SQL konfigurációbólspark.sql.session.timeZone
származó időzónát használja a rendszer. A Spark 2.4-es és újabb verzióiban a konvertálás a JVM rendszeridőzónáján alapul. Az alapértelmezett időzóna különböző forrásai megváltoztathatják a beírtTIMESTAMP
ésDATE
a literálok viselkedését.
- Időbélyeg-/dátumsztringek elemzése/formázása. Ez hatással van a CSV-/JSON-adatforrásokra és a
Apache Hive
- A Spark 3.0-ban frissítettük a beépített Hive-verziót 1.2-ről 2.3-ra, ami a következő hatásokat érinti:
- Előfordulhat, hogy be kell állítania
spark.sql.hive.metastore.version
aspark.sql.hive.metastore.jars
Hive-metaadattár azon verzióját, amelyhez csatlakozni szeretne. Például: a Hive-metaadattár 1.2.1-es verziójára van beállítvaspark.sql.hive.metastore.version
1.2.1
ésspark.sql.hive.metastore.jars
maven
arra. - Az egyéni SerDes-eket át kell telepítenie a Hive 2.3-ra, vagy saját Sparkot kell létrehoznia profillal
hive-1.2
. További részletekért lásd a HIVE-15167-et . - A decimális sztring ábrázolása eltérő lehet a Hive 1.2 és a Hive 2.3 között, ha operátort használ
TRANSFORM
SQL szkriptátalakításhoz, ami a Hive viselkedésétől függ. A Hive 1.2-ben a sztringreprezentáció kihagyja a záró nullákat. A Hive 2.3-ban azonban mindig 18 számjegyre van kipárnázva, szükség esetén záró nullákkal. - A Databricks Runtime 7.x-ben a Hive SerDe-tábla olvasásakor a Spark alapértelmezés szerint nem engedélyezi a fájlok olvasását egy olyan alkönyvtárban, amely nem táblapartíció. Az engedélyezéshez állítsa be a konfigurációt
spark.databricks.io.hive.scanNonpartitionedDirectory.enabled
a következőkénttrue
: . Ez nincs hatással a Spark natív táblázatolvasóira és fájlolvasóira.
- Előfordulhat, hogy be kell állítania
MLlib
OneHotEncoder
, amely a 2.3-ban elavult, a 3.0-sban el lett távolítva, ésOneHotEncoderEstimator
most átnevezve a következőreOneHotEncoder
: .org.apache.spark.ml.image.ImageSchema.readImages
, amely a 2.3-ban elavult, a 3.0-sban el lesz távolítva. Aspark.read.format('image')
használható helyette.org.apache.spark.mllib.clustering.KMeans.train
a 2.1-ben elavult Param Inttelruns
a 3.0-ban törlődik. Használja inkább a betanított metódust futtatás nélkül.org.apache.spark.mllib.classification.LogisticRegressionWithSGD
a 2.0-s verzióban elavult, a 3.0-s verzióban el lesz távolítva, használjaorg.apache.spark.ml.classification.LogisticRegression
vagyspark.mllib.classification.LogisticRegressionWithLBFGS
használja helyette.org.apache.spark.mllib.feature.ChiSqSelectorModel.isSorted
– a 2.1-ben elavult , a 3.0-sban el lett távolítva, nem alosztályok használatára szolgál.org.apache.spark.mllib.regression.RidgeRegressionWithSGD
, amely a 2.0-s értékben elavult, a 3.0-sban el lesz távolítva. Használjaorg.apache.spark.ml.regression.LinearRegression
a következővelelasticNetParam = 0.0
: . Vegye figyelembe, hogy az alapértelmezett értékregParam
a 0,01RidgeRegressionWithSGD
, de a 0,0.LinearRegression
org.apache.spark.mllib.regression.LassoWithSGD
, amely a 2.0-s értékben elavult, a 3.0-sban el lesz távolítva. Használjaorg.apache.spark.ml.regression.LinearRegression
a következővelelasticNetParam = 1.0
: . Vegye figyelembe, hogy az alapértelmezett értékregParam
a 0,01LassoWithSGD
, de a 0,0.LinearRegression
org.apache.spark.mllib.regression.LinearRegressionWithSGD
, amely a 2.0-s értékben elavult, a 3.0-sban el lesz távolítva. Használjaorg.apache.spark.ml.regression.LinearRegression
vagyLBFGS
használja helyette.org.apache.spark.mllib.clustering.KMeans.getRuns
asetRuns
2.1-ben elavult és a 3.0-sban el lett távolítva, és a Spark 2.0.0 óta nem volt hatása.org.apache.spark.ml.LinearSVCModel.setWeightCol
, amely a 2.4-ben elavult, a 3.0-sban törlődik, és nem felhasználók számára készült.- A 3.0-ban
org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel
kiterjesztiMultilayerPerceptronParams
a betanítási paramok felfedésére. Ennek eredményeképpenlayers
a következőreMultilayerPerceptronClassificationModel
módosultArray[Int]
:IntArrayParam
. A rétegek méretének lekérése helyettMultilayerPerceptronClassificationModel.layers
érdemes használniMultilayerPerceptronClassificationModel.getLayers
. org.apache.spark.ml.classification.GBTClassifier.numTrees
, amely a 2.4.5-ben elavult, a 3.0-s verzióban lesz eltávolítva. AgetNumTrees
használható helyette.org.apache.spark.ml.clustering.KMeansModel.computeCost
2.4-ben elavult, a 3.0-sban el lesz távolítva, használjaClusteringEvaluator
helyette.- A 2.0-ban elavult tagváltozó pontossága
org.apache.spark.mllib.evaluation.MulticlassMetrics
a 3.0-ban törlődik. Használjon inkább pontosságot. - A 2.0-ban elavult tagváltozó visszahívása
org.apache.spark.mllib.evaluation.MulticlassMetrics
a 3.0-ban törlődik. Aaccuracy
használható helyette. - A 2.0-ban elavult tagváltozó
fMeasure
org.apache.spark.mllib.evaluation.MulticlassMetrics
a 3.0-ban törlődik. Aaccuracy
használható helyette. org.apache.spark.ml.util.GeneralMLWriter.context
, amely a 2.0-s értékben elavult, a 3.0-sban el lesz távolítva. Asession
használható helyette.org.apache.spark.ml.util.MLWriter.context
, amely a 2.0-s értékben elavult, a 3.0-sban el lesz távolítva. Asession
használható helyette.org.apache.spark.ml.util.MLReader.context
, amely a 2.0-s értékben elavult, a 3.0-sban el lesz távolítva. Asession
használható helyette.abstract class UnaryTransformer[IN, OUT, T <: UnaryTransformer[IN, OUT, T]]
A a 3.0-sra módosulabstract class UnaryTransformer[IN: TypeTag, OUT: TypeTag, T <: UnaryTransformer[IN, OUT, T]]
.- A Spark 3.0-ban a Pysparkban a többosztályos logisztikai regresszió mostantól (helyesen) ad vissza
LogisticRegressionSummary
, nem pedig az alosztálytBinaryLogisticRegressionSummary
. Az általukBinaryLogisticRegressionSummary
közzétett további metódusok ebben az esetben egyébként sem működnek. (SPARK-31681) - A Spark 3.0-ban a
pyspark.ml.param.shared.Has*
mixinek már nem biztosítanakset*(self, value)
beállító metódusokat, helyette a megfelelőtself.set(self.*, value)
kell használni. További részletekért lásd a SPARK-29093-at. (SPARK-29093)
Egyéb viselkedésváltozások
A Scala 2.12-re való frissítés a következő módosításokat foglalja magában:
A csomagcellák szerializálása másképp történik. Az alábbi példa a viselkedésváltozást és annak kezelését szemlélteti.
A következő csomagcellában definiált módon történő futtatás
foo.bar.MyObjectInPackageCell.run()
aktiválja a hibátjava.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) } }
A hiba megkerüléséhez sortörést
MyObjectInPackageCell
végezhet egy szerializálható osztályban.Bizonyos használat esetén
DataStreamWriter.foreachBatch
a forráskód frissítése szükséges. Ez a változás annak a ténynek köszönhető, hogy a Scala 2.12 automatikusan konvertálja a lambda kifejezéseket SAM-típusokra, és kétértelműséget okozhat.A következő Scala-kód például nem fordítható le:
streams .writeStream .foreachBatch { (df, id) => myFunc(df, id) }
A fordítási hiba kijavításához módosítsa
foreachBatch { (df, id) => myFunc(df, id) }
foreachBatch(myFunc _)
vagy használja kifejezetten a Java API-t:foreachBatch(new VoidFunction2 ...)
.
Mivel a Hive felhasználó által definiált függvények kezelésére használt Apache Hive-verzió és a Hive SerDes 2.3-ra frissül, két módosításra van szükség:
- A Hive felületét
SerDe
egy absztrakt osztályAbstractSerDe
váltja fel. Minden egyéni Hive-implementációhozSerDe
AbstractSerDe
áttelepítés szükséges. - A beállítás
spark.sql.hive.metastore.jars
aztbuiltin
jelenti, hogy a Hive 2.3 metaadattár-ügyfél lesz használva a Databricks Runtime 7.x metaadattárainak eléréséhez. Ha hozzá kell férnie a Hive 1.2-alapú külső metaadattárakhoz, állítsa bespark.sql.hive.metastore.jars
a Hive 1.2 JAR-fájlokat tartalmazó mappát.
- A Hive felületét
Elavulások és eltávolítások
- Az adatok kihagyási indexe elavult a Databricks Runtime 4.3-ban, és el lett távolítva a Databricks Runtime 7.x-ben. Javasoljuk, hogy inkább Delta-táblákat használjon, amelyek továbbfejlesztett adatkiugrási képességeket kínálnak.
- A Databricks Runtime 7.x-ben az Apache Spark mögöttes verziója a Scala 2.12-t használja. Mivel a Scala 2.11-ben összeállított kódtárak váratlan módon letilthatják a Databricks Runtime 7.x-fürtöket, a Databricks Runtime 7.x-et futtató fürtök nem telepítik az összes fürtön való telepítésre konfigurált kódtárakat. A fürttárak lap egy állapotot
Skipped
és egy elavulással kapcsolatos üzenetet jelenít meg, amely ismerteti a kódtár kezelésének változásait. Ha azonban olyan fürtje van, amely a Databricks Runtime egy korábbi verzióján lett létrehozva, mielőtt az Azure Databricks platform 3.20-at megjelentette volna a munkaterületen, és most szerkeszti a fürtöt a Databricks Runtime 7.x használatára, akkor az összes fürtön telepített kódtárak az adott fürtön lesznek telepítve. Ebben az esetben a telepített kódtárakban található nem kompatibilis JAR-ek a fürt letiltását okozhatják. A kerülő megoldás a fürt klónozása vagy egy új fürt létrehozása.
Ismert problémák
- Ha az év napját "D" mintabetűvel elemzi, akkor nem a megfelelő eredményt adja vissza, ha hiányzik az év mezője. Ez olyan SQL függvényekben fordulhat elő, mint amelyek
to_timestamp
a datetime sztringet dátum/idő értékre elemzik egy mintasztring használatával. (SPARK-31939) - Ha a kulcsok értéke -0,0 és 0,0, akkor előfordulhat, hogy a segédlekérdezéseken belüli illesztés/ablak/összesítés hibás eredményt ad. (SPARK-31958)
- Előfordulhat, hogy egy ablak lekérdezése nem egyértelmű, önillesztéssel kapcsolatos hibával hiúsul meg váratlanul. (SPARK-31956)
- Előfordulhat, hogy az operátorral rendelkező
dropDuplicates
streamelési lekérdezések nem tudnak újraindulni a Spark 2.x által írt ellenőrzőponttal. (SPARK-31990)