sql >> Databasteknik >  >> RDS >> Mysql

java.lang.OutofMemorySpace:Java-högutrymme medan 120 miljoner rader hämtas från databasen i pyspark

Du försöker ladda för mycket data i RAM-minnet . Du bör först minska mängden data som SQL hämtar dig innan den når Spark och optimera den med hjälp av gnistparametrar, till exempel partitioner .

Överväg en eller flera av dessa optimeringar:

  • Ange i SELECT vilka kolumner du ska visa explicit, bara de du behöver, om möjligt;
  • (Raw query) Slinga in en while cykla tills du kan fetch rader genom att slinga varje rad. Följande tekniker kan fungera genom att ställa in en konstant n_rows att läsa i minnet och uppdatera i indexera varje cykling:

LIMIT i,i+n_rows

BETWEEN i AND i+n_rows

WHILE primaryKey >= i AND primaryKey < i+n_rows

  • Använda partitioner . Använd partitionColumn , lowerBound , upperBound och numPartitions (Referens 1) och (Referens 2) :

partitionColumn välj kolumnen som ska användas för att bestämma hur data ska delas (till exempel primärnyckeln ).

lowerBound fastställer minimivärdet av partitionColumn som kommer att hämtas.

upperBound fastställer maximalvärdet av partitionColumn som kommer att hämtas.

numPartitions betyder hur många parallella anslutningar du vill ställa in för att läsa data genom RDBMS.

Så Spark kommer att hämta dina datauppsättningar med hjälp av rader som du skulle få om du gjorde SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound .




  1. förenklat:mysqli num_rows fungerar inte

  2. Hur SQLite Random() fungerar

  3. Aggregera en enda kolumn i frågan med många kolumner

  4. SELECT max(x) returnerar null; hur kan jag få det att returnera 0?