<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>유윤식</title>
  <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft" />
  <author>
    <name>yysttong</name>
  </author>
  <subtitle>망각의 동물이기 때문에 작성하는 공부/업무 다이어리</subtitle>
  <id>https://brunch.co.kr/@@1aft</id>
  <updated>2016-02-03T11:50:25Z</updated>
  <entry>
    <title>PySpark : 스칼라 번들 버전 확인 - #PySpark #Scala #Version #Opensearch</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/149" />
    <id>https://brunch.co.kr/@@1aft/149</id>
    <updated>2025-11-03T03:47:08Z</updated>
    <published>2025-11-03T03:47:08Z</published>
    <summary type="html">PySpark with Opensearch  PySpark 버전과 Scala 버전을 확인해야 하는데,  &amp;gt;&amp;gt; echo $SPARK_HOME 해보면 아마도 /opt/spark 에 위치하고 있을 것 같고  &amp;gt;&amp;gt; ls /opt/spark/jars  grep spark 확인해보면 대략 JAR 의 이름이                  이러면 3.5.3 에 2.12 &lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FKNPZogPFls0vgBszyW61pgeMhLc.png" width="444" /&gt;</summary>
  </entry>
  <entry>
    <title>Python: PySail#02 - #PySail #PySpark #Bench #GroupBy</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/148" />
    <id>https://brunch.co.kr/@@1aft/148</id>
    <updated>2025-10-21T14:58:41Z</updated>
    <published>2025-10-21T14:58:41Z</published>
    <summary type="html">PySpark Vs. PySail 비교해보기  여전히 순수한 PySpark 에 좀 더 애정이 있지만 새로운 실험(?)을 하는 것 같아서 재미있게 비교를 해보려고 조금은 복잡한 쿼리를 통해 진행.  ( spark.read.parquet(S3_PATH) .filter((F.col(&amp;quot;yyyymmdd&amp;quot;).isNotNull()) &amp;amp; (F.col(&amp;quot;yyyymmdd&amp;quot;)&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FMf0aBmKXenffpUY6lcMlBvjXlaE.png" width="200" /&gt;</summary>
  </entry>
  <entry>
    <title>Python: PySail#01 - #PySpark #PySail #SparkConnect #Intro</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/147" />
    <id>https://brunch.co.kr/@@1aft/147</id>
    <updated>2025-10-21T05:10:19Z</updated>
    <published>2025-10-20T17:20:16Z</published>
    <summary type="html">PySpark 를 더 빠르게!  Rust Engine 으로 기존 JVM 을 제거하여 GC Overhead 로 부터 자유로워진 성능을 느낄 수 있음 메모리 효율은 당연히 따라오는 결과!  uv 환경으로 패키지를 설치 패키지 버전 관련 내용은 아래 링크에서 정확하게 확인 https://docs.lakesail.com/sail/latest/introduction&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FfejO5BnwbnY9TSbJVrCSG0TdoGU.png" width="200" /&gt;</summary>
  </entry>
  <entry>
    <title>Python: Maturin#04 - #serde_json #dict</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/146" />
    <id>https://brunch.co.kr/@@1aft/146</id>
    <updated>2025-01-12T23:58:06Z</updated>
    <published>2024-08-06T11:04:17Z</published>
    <summary type="html">너무 큰 JSON 을 파이썬에서 처리할 때 고민.  너무 느리다. 메모리를 너무 많이 먹는다.  그래서 orjson 라이브러리를 사용하곤 하는데  결국 json 데이터를 핸들링하는 주체는 파이썬이고 키-값 데이터를 loop 하면서 뭔가 조작을 한다는건 부담일 수 있다.  이걸 Rust 로 보내서 동시성을 확보면 어떨까.  # maturin project &amp;gt;&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FbMJiv7MYsJwhonPNdsosWByjl1Q.png" width="260" /&gt;</summary>
  </entry>
  <entry>
    <title>Python: Maturin#03 - #orjson #그냥json</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/145" />
    <id>https://brunch.co.kr/@@1aft/145</id>
    <updated>2024-08-06T06:26:54Z</updated>
    <published>2024-08-06T06:26:54Z</published>
    <summary type="html">간단한 기록.  Python Json 모듈에서 dumps 함수를 사용하면  '문자열' 을 반환한다.  근데,  Rust 로 만들어진 orjson 모듈은 같은 dumps 함수를 통해서  '바이트 문자열' 을 반환한다.   그래서 orjson 으로 dumps 쳤을 땐 decode() 함수를 꼭 뒤에 붙여줘야 str 타입의 결과로 만들 수 있다.&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FtL8Li0wGbDv2igZIjInbEn2_zXI.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Polars #11 - #NATIVE #PYTHON #POLARS</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/144" />
    <id>https://brunch.co.kr/@@1aft/144</id>
    <updated>2024-07-29T09:58:29Z</updated>
    <published>2024-07-29T09:58:29Z</published>
    <summary type="html">지난번 포스팅에 이어서, 어떻게 Native API 로 변경할 수 있는지? 또한 그렇게 되었을 때 성능변화는 어떠한지?  에 대해서 알아보려고 한다.  group_by 이후에 map_gorups 로 각각 처리하던 방식을 Native API 로 변경해보면,  # 우선 간단하게 10개의 데이터만 사용해서, import polars as pl  pre = 1 d&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FGqsi7DIrF5dHmBxwGIoQ4KD8i7U.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Polars #10 - #전처리 #1억ROW</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/143" />
    <id>https://brunch.co.kr/@@1aft/143</id>
    <updated>2024-07-29T01:19:52Z</updated>
    <published>2024-07-29T01:19:52Z</published>
    <summary type="html">100,000,000 이라는 숫자는 빅데이터를 하다보면 별로 큰 숫자도 아닌 것처럼 보인다.  그래서 Spark 를 통해서 분산처리를 하곤 한다.  특히, 복잡한 전처리 / 후처리 로직을 붙이면 메모리는 기하급수적으로 늘어나고 Spark 엔진도 터지는 현상을 보곤한다.  무엇이 문제일까?  CPU, MEMORY 둘다 문제가 될 수 있겠지만 AWS를 사용하는&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FQuY7j_DLFK1EC5eMpPIr_fJje_Y.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Python : 1 / 8145060 (6) - #예측실패 #내돈</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/142" />
    <id>https://brunch.co.kr/@@1aft/142</id>
    <updated>2024-07-27T13:08:21Z</updated>
    <published>2024-07-27T13:08:21Z</published>
    <summary type="html">신중하게 골랐지만 결국 실패했다.  이번주(2024. 07. 27) 행운의 로또 당첨번호는  해당 번호는 어떤 위치에 존재하는가?  &amp;gt;&amp;gt; Lotto(7473568 : 1130)  전체 조합의 수에서 7,473,568 번째에 위치했다.  이로써 이전에 총 3번 당첨번호가 나왔던 7백만번대 index 에 하나의 숫자가 더해졌다.  다음주에는 어떤 위치에서 당첨&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FQ9Hju05pGfM3NGqiy87m8iMrJzI.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Python : 1 / 8145060 (5) - #2.2M #5.8M #로또희망</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/141" />
    <id>https://brunch.co.kr/@@1aft/141</id>
    <updated>2024-07-26T16:22:29Z</updated>
    <published>2024-07-26T16:22:29Z</published>
    <summary type="html">이제 로또 번호를 정확히 찍을 수 있다는 욕심은 버렸다.  위 동영상은 이번 회차(1129회차) 까지의 모든 로또 당첨번호의 index 위치를 100_000 으로 나눠서 Agg 한 결과를 Counter 를 통해서 업데이트해본 결과물이다.  사실... 순서도 없고 규칙도 없다.  Python 에서 collections 모듈을 이용해서 Counter 객체를 만&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0.fjpg/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FF4wfC9zXGRQ_S_sSp0H8aIMxqeI" width="300" /&gt;</summary>
  </entry>
  <entry>
    <title>Python : 1 / 8145060 (4) - #노답로또 #고민된다 #어느것을고를까요</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/139" />
    <id>https://brunch.co.kr/@@1aft/139</id>
    <updated>2024-07-24T12:11:11Z</updated>
    <published>2024-07-24T12:11:11Z</published>
    <summary type="html">로또 분석을 이어가는 와중에 한가지 문제가 발생했다.  우선 지난번 코드를 살짝 고쳐봤다. import numpy as np  #&amp;nbsp;all_combinations&amp;nbsp;# 총 조합 개수: 8145060, 모든 조합의 리스트 # history_data # 1129회차 까지의 1등 당첨번호 리스트  history_data = df_final.select(pl.col(&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FsdFKUToNayE1gfExyL0rmJZMqog.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Python : 1 / 8145060 (3) - #로또 #당첨번호위치 #자동원리 #당첨기원</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/138" />
    <id>https://brunch.co.kr/@@1aft/138</id>
    <updated>2024-07-23T13:52:11Z</updated>
    <published>2024-07-23T13:52:11Z</published>
    <summary type="html">이전 포스팅에서 로또 당첨번호 히스토리 정보를 읽어오고 내용을 확인했다.  1회차 ~ 1129회차 까지 모두 가져왔다.  간단하게 1129회차 당첨번호는 모든 조합 내에서 몇번째에 위치하는걸까?  그리고 모든 당첨번호들은 몇번째에 위치했으며 혹시 어떤 패턴이 있기는 한걸까? (당연히 패턴은 없다...)  나는 그럼 몇번째 위치를 선택해서 5개의 게임에서 1&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FgFQSmQK7abN0CIJkMDG_Csu3060.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Python : 1 / 8145060 (2) - #로또1등 #당첨번호</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/137" />
    <id>https://brunch.co.kr/@@1aft/137</id>
    <updated>2024-07-22T21:37:24Z</updated>
    <published>2024-07-22T21:37:08Z</published>
    <summary type="html">이제 당첨번호를 모조리 긁어와서 데이터를 만들어본다.  어떤 번호가 당첨이 되는 번호일까? 사실 이 부분은 별로 호기심이 생기지는 않는다.  내 목표는 어떤 순번(즉 모든 경우의 수를 나열했을 때 index 위치가 중요함) 일지가 관심사다.  일단 선행조건으로 위와 같이 1등 당첨번호 히스토리를 가져와야한다.  https://dhlottery.co.kr/g&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FGYr2uQ_7WN8dppi8xjySs4ShY9M.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Python : 1 / 8145060 - #로또확률 #긴여정 #파이썬과로또</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/136" />
    <id>https://brunch.co.kr/@@1aft/136</id>
    <updated>2024-07-19T19:23:41Z</updated>
    <published>2024-07-19T18:33:35Z</published>
    <summary type="html">오늘부터 일주일에 천원씩 로또를 사기로 결심했다.  좋은 뜻에서 시작하는 것으로 일단 포장을 하고, 이왕 한다면 1 / 8,145,060 확률을 뚫어 낼 수 있는 로또번호 생성기를 만들기로!  모든 로또 번호를 조합하고 이쁘게 정렬하고 지금까지 모든 로또 당첨번호를 비교하고 다음 로또 번호를 찾아낸다!  이게 바로 나의 전략이다.  from itertool&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FjZLfG7xzEZaK08vyQ_QdcRSxIz0.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Rust : collect() - #Arr2Vec #collect함수</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/135" />
    <id>https://brunch.co.kr/@@1aft/135</id>
    <updated>2024-07-17T15:47:28Z</updated>
    <published>2024-07-17T15:47:28Z</published>
    <summary type="html">1부터 100까지 숫자로 구성된 배열을 만들 때, 생각보다 귀찮은 방식을 사용해야 한다.  let mut x = { let mut arr = [0; 75]; for i in 1..75 { arr[i] = i + 1; } arr };  이러면 이제 Rust 쓰기 싫어지고 왜 쓰는지 또 이유를 찾아야 하고...  이럴땐 Vec 타입의 iter 를 사용하면 된다&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2Fn7PLLnOOHjbCZolxjhtf_UKcpk8.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Rust : 참조 &amp;amp; 역참조 - #Ref #DeRef</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/134" />
    <id>https://brunch.co.kr/@@1aft/134</id>
    <updated>2024-07-14T02:54:07Z</updated>
    <published>2024-07-13T17:05:47Z</published>
    <summary type="html">맨날 아리송하게 기억하는 참조 &amp;amp; 역참조  간단하게 String 을 활용해서 참조 &amp;amp; 역참조를 비교해보자.  fn main() { let s1 = String::from(&amp;quot;hello&amp;quot;); let s2 = s1; &amp;nbsp;// s1의 소유권이 s2로 이동 // println!(&amp;quot;{}&amp;quot;, s1); &amp;nbsp;// 오류: s1은 이미 이동!  let s3 = String::fr&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FCOeZi08IfpyscDh1Yr2qkFf6Ebc.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>PyTorch 쓰세요(6). - #GEOMETRIC #REC_SYSTEM</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/133" />
    <id>https://brunch.co.kr/@@1aft/133</id>
    <updated>2024-07-07T17:57:15Z</updated>
    <published>2024-07-07T17:54:20Z</published>
    <summary type="html">추천시스템에 Geometric 을 활용해보자.  USER : 1000 ITEM : 5000 으로 각각 세팅하고 Dummy 데이터를 만들고,  import torch import numpy as np from torch_geometric.data import Data from collections import defaultdict  # 사용자와 상품의 개수 &lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FESf2FVPgDFDSJt2gqAl2k5cot6w.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>PyTorch 쓰세요(5). - #VAE #CONV #MNIST</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/132" />
    <id>https://brunch.co.kr/@@1aft/132</id>
    <updated>2024-07-03T18:29:43Z</updated>
    <published>2024-07-03T18:29:43Z</published>
    <summary type="html">MNIST 데이터셋을 활용 CONV2D 를 결합한 VAE 작성 예제  28 X 28 사이즈의 데이터를 VAE를 활용해 복원  import torch import torch.nn as nn import torch.optim as optim import pytorch_lightning as pl import torch.nn.functional as F from&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2Fcp5YqJvjlxFBdyxPZii0MGgTwzc.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Python: DuckDB(5) - #Postgresql #Plugin</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/131" />
    <id>https://brunch.co.kr/@@1aft/131</id>
    <updated>2024-06-19T10:03:43Z</updated>
    <published>2024-06-19T10:03:43Z</published>
    <summary type="html">DuckDB 에서 Posgresql 에 연결된 Database, DB, Table 에 접근하고 바로 쿼리를 날려볼 수 있다. https://duckdb.org/docs/guides/database_integration/postgres  먼저 macos(intel version) 에서 brew 를 통해서 Postgres 를 설치하고 서비스로 등록하면 끝!  &lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2F4AbcH_PFBZDuj2LLdCYe1Eraqps.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Polars #09 - #List #Concat</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/130" />
    <id>https://brunch.co.kr/@@1aft/130</id>
    <updated>2024-06-19T00:33:14Z</updated>
    <published>2024-06-19T00:33:14Z</published>
    <summary type="html">이번엔 각 컬럼들을 모아서 list 로 만드는 방법!  저번 기록과 같은 Dummy 데이터를 가지고 %%time import polars as pl  pl.Config(fmt_table_cell_list_len=10)  gt = 1_000_000 df = pl.DataFrame({ 'A': [i for i in range(gt)], 'B': [str(i)+&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FPInINthXEPpMIHizWJ33hfsVan8.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Polars #08 - #Struct #구조체 #vs.Pandas</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@1aft/129" />
    <id>https://brunch.co.kr/@@1aft/129</id>
    <updated>2024-06-18T09:40:06Z</updated>
    <published>2024-06-18T09:39:49Z</published>
    <summary type="html">간단한 DataFrame 을 만들고 그 안에서 기존 컬럼들을 조합해서 Dict 타입의 새로운 컬럼을 생성해보자.  - struct 키워드를 알아야 한다. - with_columns 함수를 사용한다. - pandas 문법과 성능을 비교한다.  아래와 같은 데이터셋을 생성한다. %%time import polars as pl  pl.Config(fmt_tabl&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F1aft%2Fimage%2FRRNU6tkBzBy2cbZAmWkgAhgb60A.png" width="500" /&gt;</summary>
  </entry>
</feed>
