數據倉庫崗面試

1.自我介紹
2.求用戶連續登錄3天,要講出多種解法

解法1(使用SQL):

SELECTuserid
FROMloginrecord
WHEREDATEDIFF(day, time, LAG(time) OVER (PARTITION BY userid ORDER BY time)) = 1AND DATEDIFF(day, LAG(time) OVER (PARTITION BY userid ORDER BY time), TIME) = 2;

解法2(使用Hive):

SELECTuserid
FROM(SELECTuserid,time,LAG(time) OVER (PARTITION BY userid ORDER BY time) AS prev_time,DATEDIFF(day, time, prev_time) AS days_diffFROMloginrecord) AS temp
WHEREdays_diff = 1AND DATEDIFF(day, prev_time, TIME) = 2;

解法3(使用Python):

from datetime import datetime, timedeltadef is_continuous_login(login_records):user_login_days = {}for record in login_records:userid, time = recorddays_diff = (datetime.now() - datetime.strptime(time, "%Y-%m-%d")).daysif userid not in user_login_days:user_login_days[userid] = []if len(user_login_days[userid]) > 0 and days_diff == 1:prev_time = user_login_days[userid][-1][1]if days_diff == 1 and (datetime.now() - datetime.strptime(prev_time, "%Y-%m-%d")).days == 2:return Trueuser_login_days[userid].append(time)return Falselogin_records = [(1, "2022-01-01"),(1, "2022-01-02"),(1, "2022-01-03"),(1, "2022-01-04"),(2, "2022-01-01"),(2, "2022-01-02"),(2, "2022-01-03"),
]print(is_continuous_login(login_records))

以上三種解法均可實現求用戶連續登錄3天的目的。

3.將數據表行轉列

行轉列通常使用以下方法:

  1. 使用SQL查詢實現行轉列:

    SELECTcolumn1 AS column1,column2 AS column2,column3 AS column3
    FROMyour_table
    GROUP BYcolumn1, column2, column3;
    
  2. 使用SAS編程實現行轉列:

    data want;set your_table;transpose data = want;run;
    
  3. 在ASP.NET中使用報表行轉列:

    在Visual Studio中,創建一個新的報表項目,然后將數據源綁定到報表中。在設計器中,將“行”轉換為“列”的方式有以下幾種:

    a. 使用“分組與排序”任務窗格對數據進行分組。
    b. 使用“聚合”功能將數據按照指定的字段進行聚合。
    c. 使用“交叉表”功能將數據行轉換為列。

  4. 使用MySQL實現行轉列:

    SELECTcolumn1 AS column1,SUM(IF(name2 = 'yes', 1, 0)) AS column2,SUM(IF(name3 = 'yes', 1, 0)) AS column3,SUM(IF(name4 = 'yes', 1, 0)) AS column4
    FROMyour_table
    GROUP BYcolumn1;
    
    CREATE VIEW column_view ASSELECTcolumn1,column2 AS column2,column3 AS column3,column4 AS column4FROMyour_tableGROUP BYcolumn1;
    
  5. 使用Oracle實現行轉列:

    SELECTcolumn1 AS column1,SUM(IF(column2 = 'yes', 1, 0)) AS column2,SUM(IF(column3 = 'yes', 1, 0)) AS column3,SUM(IF(column4 = 'yes', 1, 0)) AS column4
    FROMyour_table
    GROUP BYcolumn1;
    

    注意:具體實現行轉列的方法和SQL語句取決于您的數據表結構和需求。在實際操作中,請根據實際情況調整相應的代碼。

4.求兩數之和,除了哈希之外的其他解法

一種簡單的非哈希解法是使用雙指針法。以下是Python代碼示例:

def add(a, b):result = []carry = 0p1, p2 = 0, 0while b != 0:x = a[p1] + b[p2] + carrycarry = x // 10result.append(x % 10)p1 += 1p2 += 1while carry:result.append(carry % 10)carry //= 10return resulta = [1, 2, 3]
b = [4, 5, 6]
print(add(a, b))  # 輸出:[5, 7, 9]

這種方法的時間復雜度為O(n),其中n是兩個數的長度。這里使用了Python列表來存儲結果,你可以根據需要使用其他數據結構。

5.對scala的了解
Scala是一門多范式的編程語言,設計初衷是實現可伸縮的語言,并集成面向對象編程和函數式編程的各種特性。它運行在標準的Java平臺上,可以與所有的Java類庫無縫協作。Scala的特點包括:1. 面向對象:Scala是一種面向對象的語言,每個值都是對象,每個方法都是調用。舉例來說,如果你執行1+2,則對于Scala而言,實際是在調用Int類里定義的名為+的方法。
2. 函數式編程:Scala也是功能完整的函數式編程語言。函數式編程以兩大核心理念為指導:函數是一等公民;程序中的操作應該將輸入值映射成輸出值,而不是當場修改數據。即方法不應該有副作用。
3. 與Java的兼容性:Scala可以與Java無縫對接,其在執行時會被編譯成JVM字節碼,這使得其性能與Java相當。Scala可以直接調用Java中的方法、訪問Java中的字段、繼承Java類、實現Java接口。Scala重度復用并包裝了原生的Java類型,并支持隱式轉換。
4. 精簡的語法:Scala的程序通常比較簡潔,相比Java而言,代碼行數會大大減少,這使得程序員對代碼的閱讀和理解更快,缺陷也更少。
5. 高級語言的特性:Scala具有高級語言的特定,對代碼進行了高級別的抽象,能夠讓你更好地控制程序的復雜度,保證開發的效率。
6. 靜態類型:Scala擁有非常先進的靜態類型系統,Scala不僅擁有與Java類似的允許嵌套類的類型系統,還支持使用泛型對類型進行參數化,用交集(intersection)來組合類型,以及使用抽象類型來進行隱藏類型的細節。通過這些特性,可以更快地設計出安全易用的程序和接口。總的來說,Scala是一門功能強大的編程語言,具有多種特點,能夠滿足不同開發需求。
6.求兩數之和要用到Spark的什么算子?

在Spark中,求兩數之和的算子是+運算符。如果你要在Spark中計算兩個數列之間的和,可以使用union算子將兩個數列合并,然后使用map算子對每個元素進行加法運算。以下是一個簡單的例子:

from pyspark import SparkContext# 創建兩個數列
sc = SparkContext()
array1 = [1, 2, 3]
array2 = [4, 5, 6]# 將兩個數列轉換為RDD
rdd1 = sc.parallelize(array1)
rdd2 = sc.parallelize(array2)# 計算兩數之和
rdd_sum = rdd1.union(rdd2).map(lambda x: x + 1)# 獲取結果
result = rdd_sum.collect()
print(result)  # 輸出:[2, 3, 4, 5, 6, 7, 8, 9]

在這個例子中,我們首先創建了兩個數列(array1和array2),然后將它們轉換為Spark的RDD。接下來,我們使用union算子將兩個RDD合并,然后使用map算子對每個元素進行加法運算。最后,我們使用collect方法將結果收集到一個數列中。

在Scala中,使用Spark求兩數之和可以使用reduce算子。以下是一個示例:

import org.apache.spark.SparkConf
import org.apache.spark.api.java.JavaRDD
import org.apache.spark.api.java.JavaSparkContextobject SparkSum {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("SparkSum").setMaster("local")val sc = new JavaSparkContext(conf)val nums = sc.parallelize(Seq(1, 2, 3, 4, 5))val sum = nums.reduce((a, b) => a + b)println("Sum: " + sum)sc.close()}
}
在這個示例中,我們首先創建了一個`SparkConf`對象,用于配置應用程序的名稱和運行模式。然后,我們創建了一個`JavaSparkContext`對象,用于執行后續的操作。接下來,我們使用`parallelize`算子將一個Seq對象轉換為一個RDD。然后,我們使用`reduce`算子計算RDD中所有元素的和。最后,我們打印出計算結果并關閉`JavaSparkContext`
7.數倉分層具體可分為哪些層?
數倉分層具體可分為以下幾層:1. ODS層(原始數據層):存放原始的數據,直接加載原始日志、數據,數據保持原貌不作處理。2. DWD層(明細數據層):結構和粒度與原始數據表保持一致,對ODS層數據進行清洗(去除空值,臟數據,超過極限范圍的數據),并進行輕度匯總。3. DWS層(服務數據層):以DWD層為基礎,進行輕度匯總。一般聚集到以用戶當日,設備當日,商家當日,商品當日等等的粒度。4. ADS層(數據應用層):為各種統計表提供數據,也有的地方把這層叫做APP層。這些層次劃分有助于對數據進行有系統的分析整理,便于進行聯機分析處理(OLAP)和數據挖掘等操作。
8.ods到dwd層做了哪些處理?
數據從ODS層(Operational Data Store)到DWD層(Data Warehouse Detail)的主要處理包括:1. 數據清洗:去除無效數據、處理異常值、填補缺失值等。
2. 數據轉換:將ods層的數據按照預定的格式和標準進行轉換,以便后續的分析和處理。
3. 數據合并:將來自不同源的數據進行整合,形成統一的數據存儲。
4. 數據分區:根據業務需求,將數據按照時間、地域、產品等維度進行分區。
5. 數據壓縮:對DWD層的數據進行壓縮,以節省存儲空間。
6. 數據建模:構建數據模型,為數據分析和報表提供支持。這些處理步驟旨在提高數據質量、簡化數據處理過程、降低數據存儲成本,并為后續的數據分析和決策提供可靠的數據基礎。
9.數據傾斜
 數據傾斜是指在分布式計算系統中,任務分配不均導致某些節點的負載過高,從而使得整個系統的性能受到影響。在大數據處理過程中,數據傾斜表現為以下幾個方面:1. 在Hadoop中,數據傾斜表現為有一個或幾個Reduce任務卡住,進度停滯在99.99%,無法完成。同時,各種Container報錯,OOM(內存溢出)等異常現象也會出現。異常的Reducer讀寫數據量極大,遠超過其他正常Reducer。2. 在Hive中,數據傾斜主要發生在SQL的Group By和Join On操作上,尤其是與數據邏輯關系密切的查詢。3. 在Spark中,數據傾斜包括Map階段的傾斜和Reduce階段的傾斜。Map階段的傾斜表現為某些Mapper處理的數據量遠大于其他Mapper,Reduce階段的傾斜則與Hadoop類似,表現為某些Reducer任務進度滯后。數據傾斜的原因主要有:1. 負載均衡實施不佳:緩存數據在分布式節點間的分布不均,導致部分節點負擔過重。2. 聚合操作:如Group By、Join On等操作可能導致數據傾斜。3. 空值產生的數據傾斜:空值在聚合操作中會被忽略,可能導致數據分布不均。4. 數據量差異:不同數據源的數據量差異過大,導致部分任務處理的數據量過大。解決數據傾斜的方法:1. 調整任務數:根據數據量和節點性能,合理調整任務數,避免任務數過少或過多。2. 數據預處理:對數據進行預處理,如過濾、去重、拆分等,減小數據傾斜的影響。3. 修改SQL:優化SQL查詢,如使用Map Join替代Reduce Join,避免使用Count(Distinct)等操作。4. 子查詢處理:對子查詢結果進行去重處理,避免重復數據導致的傾斜。5. 優化排序和選擇:在查詢中使用排序和選擇操作,提高數據分布的均勻性。6. 調整緩存策略:優化緩存數據分布,避免數據傾斜。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161216.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161216.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161216.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL知多少?這篇文章讓你從小白到入門

個人網站 本文首發公眾號小肖學數據分析 SQL(Structured Query Language)是一種用于管理和處理關系型數據庫的編程語言。 對于想要成為數據分析師、數據庫管理員或者Web開發人員的小白來說,學習SQL是一個很好的起點。 本文將為你提供一個…

ElasticSearch之系統關鍵配置

集群名稱 在配置文件$ES_HOME/config/elasticsearch.yml中指定,樣例如下: cluster:name: logging-prod或者 cluster.name: logging-prod節點的名稱 在配置文件$ES_HOME/config/elasticsearch.yml中指定,樣例如下: node:name:…

frp內網穿透配置以及相關端口、過程解釋

介紹 假設現有外網筆記本、云服務器、內網工作站三臺設備,希望使用外網筆記本通過云服務器轉發,訪問內網工作站;這里使用frp進行內網穿透。 云服務器端配置 登錄騰訊輕量型云服務器控制臺,開放轉發端口、bind_port以及deshboad…

opencv-圖像輪廓

輪廓可以簡單認為成將連續的點(連著邊界)連在一起的曲線,具有相同的顏色或者灰度。輪廓在形狀分析和物體的檢測和識別中很有用。 ? 為了更加準確,要使用二值化圖像。在尋找輪廓之前,要進行閾值化處理或者 Canny 邊界檢…

uni-app小程序 swiper 分頁器樣式修改

小程序中使用 wx-swiper-dot和wx-swiper-dot-active選擇器 H5中使用uni-swiper-dot和uni-swiper-dot-active選擇器 .swiper {height: 408px;margin-bottom: 28rpx;::v-deep .uni-swiper-dot {background: #e7e7e7;&.uni-swiper-dot-active {background: #b1b1b1;}}// #ifde…

php文件上傳例子

目錄結構&#xff1a; index.html代碼&#xff1a; <!DOCTYPE html> <html><head><title>文件上傳</title><meta charset"utf-8"></head><body><form action"./up.php" method"post" encty…

PHP基礎與安全

基礎 1. 簡介概述 ●PHP是腳本語言-是一門弱類型語言&#xff0c;不需要事先編譯 ●PHP 腳本在服務器上執行&#xff0c;然后向瀏覽器發送回純文本的 HTML 結果 ●超文本預處理器&#xff0c;服務器端腳本語 2.創建&#xff08;聲明&#xff09;PHP變量 ● 變量以 $ 符號開…

安防視頻EasyCVR平臺太陽能供電+4G攝像頭視頻監控方案的建設

在工地、光伏、風電站、水庫河道等場景中&#xff0c;以及一些偏遠地區的項目現場&#xff0c;會存在無網無電情況&#xff0c;大大制約了視頻監控系統建設的效率及可行性。在這種場景中&#xff0c;我們也可以通過太陽能供電4G監控攝像機的方案&#xff0c;滿足偏遠地區無網無…

【bug 回顧】上傳圖片超時

測試 bug 問題分析 - 上傳圖片超時 最近在測試上遇到一個莫名奇妙的問題&#xff0c;最后也沒有得到具體是哪塊的原因&#xff0c;看各位大佬有沒有思路&#xff1f;&#xff1f; 一 、背景 現在我們有三臺服務器&#xff0c;用來布兩套環境。其中另外一臺服務器3配置的 tom…

JVM中判斷對象是否需要回收的方法

在堆里面存放著Java 世界中幾乎所有的對象實例&#xff0c;垃圾收集器在對堆進行回收前&#xff0c;第一件事情就是要確定這些對象之中哪些還“ 存活 ” 著&#xff0c;哪些已經 “ 死去 ”。 引用計數算法 引用計數法是一種內存管理技術&#xff0c;它是通過對每個對象進行引用…

likeshop單商戶商城系統 任意文件上傳漏洞復現

0x01 產品簡介 likeshop單商戶標準商城系統適用于B2C、單商戶、自營商城場景。完美契合私域流量變現閉環交易使用。 系統擁有豐富的營銷玩法&#xff0c;強大的分銷能力&#xff0c;支持電子面單和小程序直播等功能。無論運營還是二開都是性價比極高的100%開源商城系統。 0x02…

java--飛翔的小鳥

游戲玩法&#xff1a;通過鼠標點擊使小鳥上下移動穿過柱子并完成得分&#xff0c;小鳥碰到柱子或掉落到地面上都會結束游戲。 游戲內圖片 Brid類&#xff1a; package bird;import org.omg.CORBA.IMP_LIMIT;import javax.imageio.ImageIO; import java.awt.image.BufferedIma…

前置聲明避免循環依賴

當你有兩個類互相引用的情況時&#xff0c;使用前置聲明可以幫助你避免循環依賴。以下是一個簡單的例子&#xff0c;其中包含兩個頭文件、兩個源文件以及一個 main 函數的示例 Toolnterface.h #pragma once#include <QString>// Forward declaration of QToolBase clas…

Eclipse常用設置-亂碼

在用Eclipse進行Java代碼開發時&#xff0c;經常會遇到一些問題&#xff0c;記錄下來&#xff0c;方便查看。 一、properties文件亂碼 常用的配置文件properties里中文的亂碼&#xff0c;不利于識別。 處理流程&#xff1a;Window -> Preferences -> General -> Ja…

golang學習筆記——羅馬數字轉換器

文章目錄 羅馬數字轉換器代碼 參考LeetCode 羅馬數字轉整數代碼 羅馬數字轉換器 編寫一個程序來轉換羅馬數字&#xff08;例如將 MCLX 轉換成 1,160&#xff09;。 使用映射加載要用于將字符串字符轉換為數字的基本羅馬數字。 例如&#xff0c;M 將是映射中的鍵&#xff0c;其值…

Qt+sqlite3使用事務提升插入效率

參考&#xff1a; 【精選】SQLite批量插入效率_sqlite 批量插入_PengX_Seek的博客-CSDN博客 (1)不使用事務時&#xff1a; clock_t t_start clock();QSqlQuery query(db);QString sql("insert into test(col1,col2) values(1,2);");for (int i 0; i < 1000; i…

c++學習之哈希

目錄 1.關于unordered系列關聯式容器 2.關于unordered_map 3.哈希&#xff08;散列&#xff09;表的實現 一&#xff0c;直接定址法 二&#xff0c;除留余數法 方法一&#xff1a;閉散列&#xff1a;開放定址法 方法二&#xff1a;閉散列&#xff1a;哈希桶/拉鏈法 4.哈希…

機器學習/sklearn 筆記:K-means,kmeans++

1 K-means介紹 1.0 方法介紹 KMeans算法通過嘗試將樣本分成n個方差相等的組來聚類&#xff0c;該算法要求指定群集的數量。它適用于大量樣本&#xff0c;并已在許多不同領域的廣泛應用領域中使用。KMeans算法將一組樣本分成不相交的簇&#xff0c;每個簇由簇中樣本的平均值描…

hadoop shell操作 hdfs處理文件命令 hdfs上傳命令 hadoop fs -put命令hadoop fs相關命令 hadoop(十三)

hadoop fs -help rm 查看rm命令作用 hadoop fs 查看命令 1. 創建文件夾&#xff1a; # hdfs前綴也是可以的。更推薦hadoop hadoop fs -mkdir /sanguo 2.上傳至hdfs命令&#xff1a; 作用&#xff1a; 從本地上傳hdfs系統 &#xff08;本地文件被剪切走&#xff0c;不存在了&…

論防火墻的體系結構

防火墻的體系結構 防火墻的體系結構 雙重宿主主機體系結構。屏蔽主機體系結構。屏蔽子網體系結構。 雙重宿主主機體系結構 雙重宿主主機體系結構是指以一臺具有雙重宿主的主機計算機作為防火墻系統的主體&#xff0c;執行分離外部網絡與內部網絡的任務。該計算機至少有兩個…