[英]Spark SQL in Google Colab fails on large data
我正在使用 Google Colab 向我的學生教授 Spark(包括 Spark SQL),並使用以下命令集來安裝和配置 Spark
!pip install -q pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").getOrCreate()
sc = spark.sparkContext
加載數據
!wget 'http://kdd.ics.uci.edu/databases/kddcup99/kddcup.data_10_percent.gz'
!mv kddcup.data_10_percent.gz kdd10.gz
data_file = "./kdd10.gz"
raw_data = sc.textFile(data_file) # approx 490K records
raw_data_sample = raw_data.sample(False, 0.1, 1234) # 10% sample, 49K records
准備數據
from pyspark.sql import Row
csv_data = raw_data.map(lambda l: l.split(",")) # using full data
#csv_data = raw_data_sample.map(lambda l: l.split(",")) # using 10% sample data
row_data = csv_data.map(lambda p: Row(
duration=int(p[0]),
protocol_type=p[1],
service=p[2],
flag=p[3],
src_bytes=int(p[4]),
dst_bytes=int(p[5])
)
)
創建表
#interactions_df = sqlContext.createDataFrame(row_data) -- deprecated
interactions_df = spark.createDataFrame(row_data)
#interactions_df.registerTempTable("interactions") -- deprecated
interactions_df.createOrReplaceTempView("interactions")
運行 SQL 查詢
#tcp_interactions = sqlContext.sql(""" --- deprecated
tcp_interactions = spark.sql("""
SELECT duration, protocol_type, dst_bytes FROM interactions WHERE protocol_type = 'udp'
""")
tcp_interactions.show()
我的問題如下。
使用 10% 的樣本數據,查詢運行完美並給出結果,但使用完整的 490K 記錄數據文件,查詢無限期掛起。 沒有這樣的錯誤,除非我中止命令
/usr/local/lib/python3.7/dist-packages/pyspark/sql/dataframe.py in show(self, n, truncate, vertical)
492
493 if isinstance(truncate, bool) and truncate:
--> 494 print(self._jdf.showString(n, 20, vertical))
495 else:
496 try:
/usr/local/lib/python3.7/dist-packages/py4j/java_gateway.py in __call__(self, *args)
1318 proto.END_COMMAND_PART
1319
-> 1320 answer = self.gateway_client.send_command(command)
1321 return_value = get_return_value(
1322 answer, self.gateway_client, self.target_id, self.name)
/usr/local/lib/python3.7/dist-packages/py4j/java_gateway.py in send_command(self, command, retry, binary)
1036 connection = self._get_connection()
1037 try:
-> 1038 response = connection.send_command(command)
1039 if binary:
1040 return response, self._create_connection_guard(connection)
/usr/local/lib/python3.7/dist-packages/py4j/clientserver.py in send_command(self, command)
473 try:
474 while True:
--> 475 answer = smart_decode(self.stream.readline()[:-1])
476 logger.debug("Answer received: {0}".format(answer))
477 # Happens when a the other end is dead. There might be an empty
/usr/lib/python3.7/socket.py in readinto(self, b)
587 while True:
588 try:
--> 589 return self._sock.recv_into(b)
590 except timeout:
591 self._timeout_occurred = True
KeyboardInterrupt:
我在另一個類似大小的數據集上觀察到了同樣的問題。 有趣的是,6 個月前,在教授上一批學生時,這段代碼曾經完美地處理了 490K 的數據。 那么出了什么問題,我該如何解決? 感謝您在這方面的任何幫助。
令人費解的是,以下查詢既適用於完整數據,也適用於樣本數據。 但沒有其他工作!
#tcp_interactions = sqlContext.sql(""" --- deprecated
tcp_interactions = spark.sql("""
SELECT distinct(protocol_type) FROM interactions
""")
tcp_interactions.show()
通過使用較早版本的 Spark 解決了該問題。 手動下載和安裝 spark-3.0.3 而不是使用 pip(下載 spark 3.2.1)可以解決問題。 要查看解決方案的工作情況,請訪問https://github.com/Praxis-QR/BDSN/blob/main/SQL_Spark_with_OLD_version_JoseDianes_Intro.ipynb
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.