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
SELECTvilka kolumner du ska visa explicit, bara de du behöver, om möjligt; - (Raw query) Slinga in en
whilecykla tills du kanfetchrader genom att slinga varje rad. Följande tekniker kan fungera genom att ställa in en konstantn_rowsatt läsa i minnet och uppdateraiindexera 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,upperBoundochnumPartitions(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 .